我可以完全跳过 ShaderLab 着色器的过程吗?

nok*_*kto 5 c# shader unity-game-engine

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

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

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

小智 0

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

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

[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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关交换着色器的更多信息