将多通道模糊着色器转换为单通道(渲染模式)

时间:2019-04-10 18:59:21

标签: c# c++ unity3d shader fragment-shader

我有Unity的模糊着色器,并且此着色器不支持SinglePass渲染模式(在基于SinglePass图形工件的Oculus GO上构建后)。我尝试使用Unity指南实现对SinglePass渲染的支持,但没有任何效果。我不知道有什么问题。

我尝试应用的

Unity SinglePass指南: https://docs.unity3d.com/Manual/SinglePassStereoRendering.html https://docs.unity3d.com/Manual/SinglePassInstancing.html

旧版本不支持单次通过渲染:

着色器“自定义/蓝色” {     性质     {         _Radius(“ Radius”,Range(1,255))= 1     }

Category
{
    Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque" }

    SubShader
    {
        GrabPass
        {
            Tags{ "LightMode" = "Always" }
        }

        Pass
        {
            Tags{ "LightMode" = "Always" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 texcoord: TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : POSITION;
                float4 uvgrab : TEXCOORD0;
            };

            v2f vert(appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #if UNITY_UV_STARTS_AT_TOP
                float scale = -1.0;
                #else
                float scale = 1.0;
                #endif
                o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
                o.uvgrab.zw = o.vertex.zw;
                return o;
            }

            sampler2D _GrabTexture;
            float4 _GrabTexture_TexelSize;
            float _Radius;

            half4 frag(v2f i) : COLOR
            {
                half4 sum = half4(0,0,0,0);

                #define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w)))

                sum += GRABXYPIXEL(0.0, 0.0);
                int measurments = 1;

                for (float range = 0.1f; range <= _Radius; range += 0.1f)
                {
                    sum += GRABXYPIXEL(range, range);
                    sum += GRABXYPIXEL(range, -range);
                    sum += GRABXYPIXEL(-range, range);
                    sum += GRABXYPIXEL(-range, -range);
                    measurments += 4;
                }

                return sum / measurments;
            }
            ENDCG
        }
        GrabPass
        {
            Tags{ "LightMode" = "Always" }
        }

        Pass
        {
            Tags{ "LightMode" = "Always" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 texcoord: TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : POSITION;
                float4 uvgrab : TEXCOORD0;
            };

            v2f vert(appdata_t v)
            {
                v2f o;
                 o.vertex = UnityObjectToClipPos(v.vertex);
                #if UNITY_UV_STARTS_AT_TOP
                float scale = -1.0;
                #else
                float scale = 1.0;
                #endif                  
                o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
                o.uvgrab.zw = o.vertex.zw;
                return o;
            }

            sampler2D _GrabTexture;
            float4 _GrabTexture_TexelSize;
            float _Radius;

            half4 frag(v2f i) : COLOR
            {

                half4 sum = half4(0,0,0,0);
                float radius = 1.41421356237 * _Radius;

                #define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w)))

                sum += GRABXYPIXEL(0.0, 0.0);
                int measurments = 1;

                for (float range = 1.41421356237f; range <= radius * 1.41; range += 1.41421356237f)
                {
                    sum += GRABXYPIXEL(range, 0);
                    sum += GRABXYPIXEL(-range, 0);
                    sum += GRABXYPIXEL(0, range);
                    sum += GRABXYPIXEL(0, -range);
                    measurments += 4;
                }

                return sum / measurments;
            }
            ENDCG
        }
    }
}

}

我的非工作更改:

着色器“自定义/蓝色” {     性质     {         _Radius(“ Radius”,Range(1,255))= 1     }

Category
{
    Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque" }

    SubShader
    {
        GrabPass
        {
            Tags{ "LightMode" = "Always" }
        }

        Pass
        {
            Tags{ "LightMode" = "Always" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 texcoord: TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : POSITION;
                float4 uvgrab : TEXCOORD0;
            };

            v2f vert(appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                #if UNITY_UV_STARTS_AT_TOP
                float scale = -1.0;
                #else
                float scale = 1.0;
                #endif

                o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
                o.uvgrab.zw = o.vertex.zw;
                return o;
            }

            sampler2D _GrabTexture;
            float4 _GrabTexture_TexelSize;
            float _Radius;
            half4 _MainTex_ST;

            half4 frag(v2f i) : SV_Target
            {
                half4 sum = half4(0,0,0,0);

                #if UNITY_SINGLE_PASS
                    #define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(UnityStereoScreenSpaceUVAdjust(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w),_MainTex_ST)))
                #else
                    #define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w)))
                #endif
                sum += GRABXYPIXEL(0.0, 0.0);
                int measurments = 1;

                for (float range = 0.1f; range <= _Radius; range += 0.1f)
                {
                    sum += GRABXYPIXEL(range, range);
                    sum += GRABXYPIXEL(range, -range);
                    sum += GRABXYPIXEL(-range, range);
                    sum += GRABXYPIXEL(-range, -range);
                    measurments += 4;
                }

                return sum / measurments;
            }
            ENDCG
        }
        GrabPass
        {
            Tags{ "LightMode" = "Always" }
        }

        Pass
        {
            Tags{ "LightMode" = "Always" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest
            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 texcoord: TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : POSITION;
                float4 uvgrab : TEXCOORD0;
            };

            v2f vert(appdata_t v)
            {
                v2f o;
                 o.vertex = UnityObjectToClipPos(v.vertex);
                #if UNITY_UV_STARTS_AT_TOP
                float scale = -1.0;
                #else
                float scale = 1.0;
                #endif

                o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
                o.uvgrab.zw = o.vertex.zw;
                return o;
            }

            sampler2D _GrabTexture;
            float4 _GrabTexture_TexelSize;
            float _Radius;
            half4 _MainTex_ST;

            half4 frag(v2f i) : SV_Target
            {

                half4 sum = half4(0,0,0,0);
                float radius = 1.41421356237 * _Radius;

                #if UNITY_SINGLE_PASS
                #define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(UnityStereoScreenSpaceUVAdjust(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w),_MainTex_ST)))
                #else
                #define GRABXYPIXEL(kernelx, kernely) tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(float4(i.uvgrab.x + _GrabTexture_TexelSize.x * kernelx, i.uvgrab.y + _GrabTexture_TexelSize.y * kernely, i.uvgrab.z, i.uvgrab.w)))
                #endif
                sum += GRABXYPIXEL(0.0, 0.0);
                int measurments = 1;

                for (float range = 1.41421356237f; range <= radius * 1.41; range += 1.41421356237f)
                {
                    sum += GRABXYPIXEL(range, 0);
                    sum += GRABXYPIXEL(-range, 0);
                    sum += GRABXYPIXEL(0, range);
                    sum += GRABXYPIXEL(0, -range);
                    measurments += 4;
                }

                return sum / measurments;
            }
            ENDCG
        }
    }
}

}

我希望此着色器将支持SinglePass VR渲染模式。

0 个答案:

没有答案