【问题标题】:Volumetric Fog Shader - Camera Issue体积雾着色器 - 相机问题
【发布时间】:2013-06-15 12:19:27
【问题描述】:

我正在尝试构建一个无限雾着色器。此雾应用于 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,但我不知道如何实现此效果。

【问题讨论】:

  • 但是雾本质上取决于相机位置,除非你有一些明确的雾几何形状,即使在这种情况下,它也必须依赖于相机,但也会受到其几何形状的影响。
  • 当然要取决于相机的位置。但是下面的屏幕截图显示的效果不符合我的需求。我用 ComputeGrabScreenPos 和 ComputeScreenPos 的内容更新了着色器的代码。
  • 那我不太明白你想要达到什么目的,你能详细说明你的问题是什么?
  • 如果你看看我的回答和蓝线截图,我想你会理解我的问题。你看到的黑色是对我来说“假”的实际行为。蓝线是它应该是的。与我的飞机而不是我的相机平行的雾(第一张截图显示了我认为的问题)。雾应该基于平面方向。你明白我的意思吗?
  • 所以你的雾从平面开始,在它之前不存在,当你看平面之前的物体时,你想要它们就好像没有雾一样?

标签: directx unity3d shader fragment-shader


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2011-05-21
      相关资源
      最近更新 更多