Геометрический шейдер не работает (unity3d)

Я разрабатываю шейдер в единстве. Шейдер должен содержать вершинный, фрагментный и геометрический шейдеры, и хотя первые два работают нормально, у меня есть проблемы с геометрическим шейдером.

Когда я использую приведенный ниже код, затененный объект, шейдер просто окрашивается в розовый цвет, но я не вижу ошибок компиляции шейдера. Если я просто удаляю геометрию шейдера, все работает как положено.

Текущая реализация должна просто копировать входные данные в вывод, т.е. ничего не делать.

Еще одна интересная вещь заключается в том, что Unity может игнорировать содержимое геометрического шейдера - если я удалю из него все, объект все еще будет розовым. В моем понимании ничего не должно быть оказано в этом случае.

Код, который я использую:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/VoidCircle" 
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Progress ("Progress", float) = 0.4
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
             Blend SrcAlpha OneMinusSrcAlpha
        LOD 100

        Pass
        {
            CGPROGRAM

            #pragma geometry geom
            #pragma vertex vert
            #pragma fragment frag

            struct appdata
            {
                float4 vertex : POSITION; // vertex position
                float2 uv : TEXCOORD0; // texture coordinate
            };

            struct v2f
            {
                float2 uv : TEXCOORD0; // texture coordinate
                float4 vertex : SV_POSITION; // clip space position
            };

           v2f vert (appdata v)
           {
               v2f o;
               o.vertex = UnityObjectToClipPos(v.vertex);
               o.uv = v.uv;
               return o;
           }  

            // ALL THE PROBLEMS ARE HERE          
            [maxvertexcount(3)]
            void geom(triangle v2f input[3], inout TriangleStream<v2f> OutputStream)
            {         
                for (int i = 0; i < 3; i++) {
                   OutputStream.Append(input[i]);
                }               
            }

            sampler2D _MainTex;
            float4 _MainTex_TexelSize;

            float4 frag (v2f i) : SV_Target
            {

                float4 col = tex2D(_MainTex, i.uv);
                float besta = 0;
                int d = 1;        

                for (int x = -d; x <= d; x++) {
                    for (int y = -d; y <= d; y++) {
                        float4 col1 = tex2D(_MainTex, i.uv + fixed2(_MainTex_TexelSize.x * x, _MainTex_TexelSize.y * y));
                        if (col1.a > besta) {
                            besta = col1.a;
                        }
                    }
                }

                if (col.a > 0) {
                    return float4(col.a, col.a, col.a, 1);
                } else {
                    return float4(0, 0, 0, besta);
                }

            }
            ENDCG
        }
    }
}

1 ответ

Есть проблема. Геометрические шейдеры поддерживаются в OpenGL 3.1, если я не ошибаюсь. Мое аппаратное обеспечение реализует OpenGL 3.0

Другие вопросы по тегам