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. 使用mriTexture()mriTextureLod()来进行纹理查找,其方式与 GLSL 中texture()textureLod()用法相同。

开发者示例

在调用方的节点 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 mriTexture()mriTextureLod()函数可用于查找实际的纹理值,例如:

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



更多帮助

如果您遇到任何问题,请创建支持工单并向我们提供本文中要求的信息:
Q100090:报告Mari问题时需要发送给支持团队的信息

如需了解如何提交支持工单,请参阅本文:
Q100064:如何提交支持工单

    我们很遗憾听到

    请告诉我们