首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ShaderLab中缓存公共(所有像素)变量?

如何在ShaderLab中缓存公共(所有像素)变量?
EN

Stack Overflow用户
提问于 2019-05-25 10:09:32
回答 1查看 73关注 0票数 0

假设我有以下着色器:

代码语言:javascript
复制
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
        }
    }
}

在上面的代码中,我需要从相关函数a - z计算变量calculateA() - calculateZ()的值(这只是一个泛化的例子)。假设这些函数是复杂的,它们依赖于每个帧中变化的着色器的其他属性,而不是像素本身。我们知道每一次都会计算每个像素的复函数。

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

目前,我通过使用以下方法设置C#脚本中的值来解决这个问题:

代码语言:javascript
复制
gameObject.GetComponent<Renderer>().material.SetFloat("a", calculateA());
.
.
.
gameObject.GetComponent<Renderer>().material.SetFloat("z", calculateZ());

但是我更喜欢把着色器和C#脚本代码分开。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-27 07:36:33

嗯,你就是这样做的:)

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

  • 如果所述方法仅由常量计算,则编译器将对其进行优化。
  • 如果该方法没有多少可预测的结果,您可以将它们预先计算到在着色器本身中声明的数组中,或者从代码中设置一次,而不是每一帧。
  • 如果有很多这些可预测的结果,你可以考虑把它们烘焙成纹理,或者你可以使用现代的GPU,变成结构化的缓冲区。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56303832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档