【问题标题】:Can I totally skip a pass of a ShaderLab shader?我可以完全跳过 ShaderLab 着色器吗?
【发布时间】:2016-01-23 01:35:55
【问题描述】:

我想根据 Unity 中检查器的属性完全跳过着色器的传递,例如:(请记住,这不会编译)

Shader "Name"
{
Properties
{
    [Toggle(STUFF_ON)] _StuffOn("Stuff On", Float) = 1
}
SubShader
{
    #if STUFF_ON
    Pass
    {
        [...]
    }
    #endif
    Pass
    {
        [...]
    }
}
}

我已经找到了 Toggles(如示例中所示)、pragma shader_feature 和 multi_compile,但所有这些都只允许我在传递本身内部使用指令。

【问题讨论】:

    标签: c# unity3d shader


    【解决方案1】:

    我认为您可能需要复制着色器,但没有您想跳过的通道。然后根据需要进行交换。

    这里是一个如何在单一行为中交换着色器的示例供参考:

    [RequireComponent(typeof(Renderer))]
    public class ShaderSwapExample : MonoBehaviour
    {
    
        void Start()
        {
            Shader TransDiffuseShader = Shader.Find("Transparent/Diffuse");
    
            if (TransDiffuseShader != null)
            {
                Renderer renderer = GetComponent<Renderer>();
                renderer.material.shader = TransDiffuseShader;
            }
        }
    }
    

    你可以找到更多关于交换着色器的信息here

    【讨论】:

    • 我想应该可以,尽管我一直在寻找不意味着重复代码的东西,因为那时维护是一个问题。我发现的另一个解决方案是在禁用该功能时简单地将 float4(0,0,0,0) 渲染为输出。
    • 如果你打算将它与数百个对象一起使用,这个解决方案非常昂贵。
    • 取决于@Sergey 之后的你。如果您使用数百个对象,则可能值得更新特定材质的着色器和/或使用 renderer.sharedMaterial。如果适应性是关键,最好查看更复杂的着色器,例如 Unity 默认着色器,它可以动态更改它使用的通道。几乎可以肯定,这需要在硬件端上传 GPU。我个人认为让着色器做最少的工作并根据要求在它们之间进行交换效果很好。
    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    相关资源
    最近更新 更多