Q100410: テクスチャを渡してカスタム GLSL で生のテクスチャ ルックアップ呼び出しを行う方法

フォローする

まとめ

Mariのカスタム シェーダ、レイヤ、またはノード XML を作成する場合、カスタム GLSL 関数を別のファイルに含めておく方が便利な場合があります。これらの関数を別のファイルに保存することを選択した場合は、関数が独自の特別な処理を実行できるようにするキューブマップ テクスチャ ルックアップを使用する必要があります。

この記事では、 Mariで生のテクスチャ ルックアップ呼び出しを行う方法について説明します。これにより、同じ呼び出しが、異なるシェーダ モード間およびMariの将来のリリース間で一貫して機能します。

詳しくは

これはMariの公式機能とは見なされませんが、カスタム シェーダーを開発する場合、以前はカスタム ノードの imagecube アトリビュートから SamplerCube を取得することが可能でした。これにより、過去のMariバージョンでは、ユーザーは GLSL の texture() 関数を利用する生のテクスチャ ルックアップを作成できました。

Mari 3.4v1 および 4.1v1 では、 Mariのシェーダー システムの内部改良により、 Mariテクスチャ ルックアップに間接変数を代わりに使用するようになりました。

何をする必要があるか

これらの変更を回避し、生のテクスチャ ルックアップを作成するには、次のことを行う必要があります。

  1. XML にTexture.glslhを含めます
  2. テクスチャ サンプラーをcubemapTokenとして宣言します
  3. GLSL でtexture()およびtextureLod() が使用されるのと同じ方法でテクスチャ ルックアップを行うには、mriTexture() または mriTextureLod() を使用します。

開発者の例

ノード XML ファイルの呼び出し側では、以下のようにカスタム GLSL 関数の呼び出しを行うことができます。

...
<Attribute Name="Cubemap" PrettyName="Image" Type="imagecube"></Attribute>
...
textureSampleColor = customCubemapLookup( $Cubemap, coords, lod ); 


次に、GLSL ヘッダー ファイルで、cubemapToken 引数を受け取るカスタム関数を次のように宣言できます。

//! include | Texture.glslh
vec4 customCubemapLookup(cubemapToken cubemapTexture, vec3 dir, float lod);


さらに、GLSL ソース コード ファイル内で、cubemapToken 引数を受け取るカスタム関数を定義できます。 mriTexture() 関数と mriTextureLod() 関数を使用すると、次のように実際のテクスチャ値を検索できます。

#version 150
//! include | Texture.glslh
vec4 customCubemapLookup(cubemapToken token, vec3 coords, float lod)
{
    return mriTextureLod(token, coords, lod);
}

    私たちはそれを聞いて申し訳ございません

    理由をお聞かせください