如何缓存ShaderLab中的常用(用于所有像素)变量



假设我有以下着色器:

Shader "Sprites/X"
{
    Properties
    {
        [HideInInspector] _MainTex("Sprite Texture", 2D) = "black" {}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            // bla bla
            fixed4 frag(v2f i) : SV_Target
            {
                float a = calculateA();
                float b = calculateB();
                .
                .
                .
                float z = calculateZ();
                // Here the values above mix with x-y position of the pixel
                // and then return a color
            }
            ENDCG
        }
    }
}

在上面的代码中,我需要从相关函数calculateA() -calculateZ()中计算变量a -z的值(这只是一个概括示例(。假设这些函数很复杂,并且它们取决于着色器的其他属性,这些函数在每个帧中都会改变,而不是像素本身。我们知道每次为每个像素计算复合功能。

有一种方法可以"缓存"这些值以避免每个像素的计算?在所有帧中,所有像素的值都是相同的。

目前,我正在通过以下方式设置C#脚本中的值来解决问题。

gameObject.GetComponent<Renderer>().material.SetFloat("a", calculateA());
.
.
.
gameObject.GetComponent<Renderer>().material.SetFloat("z", calculateZ());

好吧,这正是您要做的:(

这取决于为什么要避免使用C#

确切的原因
  • 如果仅根据常数计算上述方法,则该编译器会优化它。
  • 如果该方法几乎没有可预测的结果您可以将它们预先计算到着色器本身中声明的数组中,也可以从代码而不是每个帧中设置一次。
  • 如果有很多可预测的结果,您可以考虑烘烤它们变成质地,或者如果您可以使用现代GPU,则将其变成结构化缓冲区。

相关内容

最新更新