Volumetric Fog Shader - 相机问题

时间:2013-06-15 12:19:27

标签: directx unity3d shader fragment-shader

我正在尝试构建一个无限雾着色器。此雾应用于3D平面 目前我有Z-Depth Fog。我遇到了一些问题。

正如您在屏幕截图中看到的,有两种观点 绿色是我的3D平面。问题出在红线上。这条线似乎取决于我的相机并不好,因为当我旋转相机时,线条会受到相机位置和旋转的影响。

enter image description here

我不知道它来自何处,以及如何根据相机位置设置雾限。

着色

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

            uniform float4      _FogColor;
            uniform sampler2D   _CameraDepthTexture;
            float               _Depth;
            float               _DepthScale;

            struct v2f {
                float4 pos : SV_POSITION;
                float4 projection : TEXCOORD0;
                float4 screenPosition : TEXCOORD1;
            };

            v2f vert(appdata_base v) {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

            // o.projection = ComputeGrabScreenPos(o.pos);
        float4 position = o.pos;
        #if UNITY_UV_STARTS_AT_TOP
        float scale = -1.0;
        #else
        float scale = 1.0;
        #endif
        float4 p = position * 0.5f;
        p.xy = float2(p.x, p.y * scale) + p.w;
        p.zw = position.zw;
        o.projection = p;

                // o.screenPosition = ComputeScreenPos(o.pos);
        position = o.pos;
        float4 q = position * 0.5f;
        #if defined(UNITY_HALF_TEXEL_OFFSET)
        q.xy = float2(q.x, q.y * _ProjectionParams.x) + q.w * _ScreenParams.zw;
        #else
        q.xy = float2(q.x, q.y * _ProjectionParams.x) + q.w;
        #endif
        #if defined(SHADER_API_FLASH)
        q.xy *= unity_NPOTScale.xy;
        #endif
            q.zw = position.zw;
        q.zw = 1.0f;
        o.screenPosition = q;

                return o;
            }
            sampler2D _GrabTexture;

            float4 frag(v2f IN) : COLOR {
                float3 uv = UNITY_PROJ_COORD(IN.projection);
                float depth = UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, uv));
                depth = LinearEyeDepth(depth);
                return saturate((depth - IN.screenPosition.w + _Depth) * _DepthScale);
            }
        ENDCG
    }


接下来我想旋转我的雾来进行Y-Depth Fog,但我不知道如何达到这个效果。

2 个答案:

答案 0 :(得分:1)

我看到了两种方法来实现你想要的东西:

  1. 是根据平面深度和物体深度的差异渲染平面深度,计算雾度,如果obj深度较小则为0,(objDepth - planeDepth)*如果较大则为比例)< / p>

  2. 不是渲染到纹理而是在着色器中计算到平面的距离而是直接使用它。

  3. 我不确定你做了什么,因为我对Unity表面着色器不是很熟悉,但是从代码中得到了一些不同的结果。

答案 1 :(得分:0)

这似乎是由_CameraDepthTexture引起的,这就是使用相机位置计算深度的原因。 但我不知道如何纠正它......似乎没有办法从另一点获得深度。有什么想法吗?

这是另一个例子。绿色你可以“看到”物体,蓝线对我来说应该是雾。

enter image description here