1

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

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

在此处输入图像描述

我不知道它来自哪里以及如何使我的雾限制不基于相机位置。

着色器

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
    }


接下来我想旋转我的 Fog 以获得 Y-Depth Fog 但我不知道如何实现这个效果。

4

2 回答 2

1

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

  1. 是将平面的深度渲染到纹理并根据平面深度和对象深度的差异计算雾,如果 obj 深度较小,则为 0,如果较大,则为 (objDepth - planeDepth) * scale)

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

我不确定你做了什么,因为我对 Unity 表面着色器不是很熟悉,但从代码和结果来看,会有所不同。

于 2013-07-04T08:17:40.137 回答
0

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

这是另一个例子。在绿色中,您可以“看到”该对象,而蓝线对我来说是雾应该是的。

在此处输入图像描述

于 2013-06-18T07:29:50.567 回答