翻转深度着色器的输出

时间:2017-12-23 19:08:07

标签: shader depth

已解决!! 尤里卡!哦,伙计......这是我在这个问题上挣扎的5天,我一求得帮忙就解决了! O_O 我必须在查找(tex2dproj)之前和之后以及在Linear01Depth之前反转片段着色器ONCE内的纹理。 像那样:

//Fragment Shader
half4 frag (v2f i) : COLOR{
           i.scrPos.y = 1 - i.scrPos.y;
           fixed4 preRender = tex2Dproj(_PreTex, i.scrPos);
           i.scrPos.y = 1 - i.scrPos.y;
           float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
 etc........

我正在使用Unity,我有一个带有renderTexture的正交相机,可以使用顶点/片段着色器从botton到顶部获得场景的深度。

我知道DirectX和OpenGL之间有关于如何渲染y轴以及简单的周转是在顶点翻转它的行为。这是我的基本着色器。

Shader "Custom/DepthGrayscale" {

SubShader {
    Tags { "RenderType"="Transparent" }

    Pass{           
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        sampler2D _CameraDepthTexture;

        struct v2f {
           float4 pos : SV_POSITION;
           float4 scrPos : TEXCOORD0;              
        };

        //Vertex Shader
        v2f vert (appdata_base v){
           v2f o;
           o.pos = UnityObjectToClipPos (v.vertex);
           o.scrPos = ComputeScreenPos(o.pos);
           o.scrPos.y = 1 - o.scrPos.y; //here's where the magic happens!
           return o;
        }

        //Fragment Shader
        half4 frag (v2f i) : COLOR{
           float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
           fixed4 depth;

           depth.r = depthValue;
           depth.g = depthValue;
           depth.b = depthValue;
           depth.a = depthValue;

           return depth;
        }
    ENDCG
    }
}
FallBack "Diffuse" }

现在,我想在物体移动时获得物体的“痕迹”。为了实现这一点,我使用了一个具有纹理属性的类似着色器,这是另一个我保存渲染输出的renderTexture,同时用于混合当前帧。这是DepthTrace Shader。

Shader "Custom/DepthTrace" {

Properties {
    _PreTex ("", 2D) = "white" {}
}

SubShader {
    Tags { "RenderType"="Transparent" }

    Pass{
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        sampler2D _CameraDepthTexture;

        struct v2f {
           float4 pos : SV_POSITION;
           float4 scrPos : TEXCOORD0;
        };

        //Vertex Shader
        v2f vert (appdata_base v){
           v2f o;
           o.pos = UnityObjectToClipPos (v.vertex);
           o.scrPos = ComputeScreenPos(o.pos);
           o.scrPos.y = 1 - o.scrPos.y;
           return o;
        }

        sampler2D _PreTex;

        //Fragment Shader
        half4 frag (v2f i) : COLOR{
           fixed4 preRender = tex2Dproj(_PreTex, i.scrPos);
           float depthValue = Linear01Depth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos)).r);
           fixed4 depth;

           if (preRender.r < depthValue) {
                depthValue = preRender.r;
           }

           depth.r = depthValue;
           depth.g = depthValue;
           depth.b = depthValue;
           depth.a = depthValue;

           return depth;
        }
    ENDCG
    }
}
FallBack "Diffuse" }

现在,“踪迹”效果很好但我得到了 double specular image

如果我没有翻转y轴,我得到一个good image,当然完全在y轴上翻转。

似乎深度输入被翻转而_PreTex不是!

我不会简单地在常规脚本中翻转输出,在性能方面我已经失去了GPU计算的所有优势。

你知道为什么会这样吗?谢谢。

0 个答案:

没有答案