Directx 雾影摄影机

Directx 雾影摄影机,directx,unity3d,shader,fragment-shader,Directx,Unity3d,Shader,Fragment Shader,我在Unity中使用顶点片段雾着色器时遇到一些困难。我有一个很好的视觉效果,但问题是梯度是基于相机的位置,它随着相机的移动而移动。我不知道怎么修理它 以下是着色器代码 struct v2f { float4 pos : SV_POSITION; float4 grabUV : TEXCOORD0; float2 uv_depth : TEXCOORD1; float4 interpolatedRay : TEXCOORD2; float4 screenPo

我在Unity中使用顶点片段雾着色器时遇到一些困难。我有一个很好的视觉效果,但问题是梯度是基于相机的位置,它随着相机的移动而移动。我不知道怎么修理它

以下是着色器代码

struct v2f {
    float4 pos : SV_POSITION;
    float4 grabUV : TEXCOORD0;
    float2 uv_depth : TEXCOORD1;
    float4 interpolatedRay : TEXCOORD2;
    float4 screenPos : TEXCOORD3;
};

v2f vert(appdata_base v) {
    v2f o;
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
    o.uv_depth = v.texcoord.xy;
    o.grabUV = ComputeGrabScreenPos(o.pos);
    half index = v.vertex.z;
    o.screenPos = ComputeScreenPos(o.pos); 
    o.interpolatedRay = mul(UNITY_MATRIX_MV, v.vertex);
    return o;
}

sampler2D _GrabTexture;

float4 frag(v2f IN) : COLOR {
    float3 uv = UNITY_PROJ_COORD(IN.grabUV);
    float dpth = UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, uv));
    dpth = LinearEyeDepth(dpth);
    float4 wsPos = (IN.screenPos + dpth * IN.interpolatedRay); // Here is the problem but how to fix it
    float fogVert = max(0.0, (wsPos.y - _Depth) * (_DepthScale * 0.1f));
    fogVert *= fogVert; 
    fogVert = (exp (-fogVert));
    return fogVert;
}

这似乎是一个矩阵问题

o.interpolatedRay = mul(UNITY_MATRIX_MV, v.vertex);

这不是雾的工作原理吗?不,实际的行为是,如果我看物体的顶部,雾在世界空间中不再是水平的,它总是基于相机的位置。啊,你想要真实的体积雾吗?是的,这是我的问题,但唯一的问题是相机的问题。