片段着色器 if else 奇怪的行为

Frag Shader if else odd behaviour

下面是我正在处理的当前着色器系统的简化版本,它将数据从一次分派的计算着色器中提取到顶点程序:v2f,然后将此数据解析为 v2fc - 此结构存储静态添加了 rend 浮点数的数据。 当前手动设置的此浮点值将与外部输入、属性或可能与另一个计算内核相关联。

正如在 frag 程序中看到的,这用于有效地决定是否渲染实例。

我也尝试过使用 'discard' 函数,但我被告知这种方法效率低下。 另外,我尝试将 rend 设为 int,并包含一个 switch 语句。

所有这些方法都给了我相同的结果: else 或 default 情况 无论 switch/if 条件如何,选项始终执行。

我确实有一些使用 c++ 的经验,但主要是 c#,并且对复杂的着色器系统比较陌生,所以如果语法不正确,请原谅我。

非常感谢对此问题的任何建议或解释。

//TODO Rendfiltermethods

Shader "Custom/StarShaderTemp" 
{

Properties 
{
    _MainTex ("Base (RGB)", 2D) = "white" {}
    _Color(" Color", Color) = (1, 0.5, 0.5, 1)
    _Scale(" Scale ", Float) = 1
    _Damping(" Damping Value", Float) = 500

}

SubShader 
{
    Pass 
    {
        Tags { "RenderType" = "Transparent"}
        ZTest Off
        ZWrite Off
        Cull Off
        Blend SrcAlpha One

        CGPROGRAM
        #pragma target 5.0

        #pragma vertex star_vertex
        #pragma vertex star_cull
        #pragma fragment frag
        #pragma exclude_renderers gles
        #include "UnityCG.cginc"
        #include "StarStructInc.cginc"

             StructuredBuffer<Star> stars;
             StructuredBuffer<float3> quadPoints; 

             StructuredBuffer<int> cullint; //Input from cull compute shader for bypassing gifmain compute

            sampler2D _MainTex;

            sampler2D _O;
            sampler2D _B;
            sampler2D _A;
            sampler2D _F;
            sampler2D _G;
            sampler2D _K;
            sampler2D _M;
            sampler2D _Blackhole;

            float4 _Color;
            float _Scale;
            float _CamDist;
            float _Damping;

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv  : TEXCOORD0;
                float4 color : COLOR;

            };

            struct v2fc
            {
             v2f vetwof : v2f;
             float rendfloat: float;    
            };


            // vertex shader with no inputs
            // uses the system values SV_VertexID and SV_InstanceID to read from compute buffers
            v2f star_vertex(uint id : SV_VertexID, uint inst : SV_InstanceID)
            {
                v2f o;

                float3 worldPosition = stars[inst].position;
                float3 Qpoint = quadPoints[id] * _Scale * sqrt(_CamDist / _Damping);

                o.pos = mul (UNITY_MATRIX_P, mul (UNITY_MATRIX_V, float4(worldPosition, 1.0f)) + float4(Qpoint, 0.0f));

                o.uv = quadPoints[id] + 0.5f; //setting UV texture coord center 

                return o;
            }

            v2fc star_cull(v2f i)
            {
                v2fc c;
                c.vetwof = i;
                c.rendfloat = 6.0;              
                return c;
            }


            float4 frag (v2fc i) : COLOR
            {                   
                    if(i.rendfloat < 5.0)
                    {
                    float4 texColn = tex2D (_MainTex, i.vetwof.uv);
                    return texColn * _Color;    
                    }
                    else
                    {   
                     i.vetwof.pos =0;       
                    float4 texColn = tex2D (_MainTex, i.vetwof.uv);
                    return texColn * _Color;                                    

                    }               

            }               
        ENDCG
    }
} 

FallBack "Diffuse"

}

else 行为已通过创建 void 函数而不是 success frag ETC 得到纠正。查看编译后的代码后,似乎在优化汇编时使用的分支预测存在问题,因为可以组合片段函数引用。 另一个修复方法是对渲染目标使用多个通道。