Fog shader

Hi,

I have some difficulties with my fog shader. I have a good visual result but the problem is that the gradient is based on the camera’s position, it moves as the camera moves. I don’t know how to fix it.

Here is the shader code.

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;
}

Thanks a lot !

The fog (gradient?) is supposed to change based on the camera’s position, at least as far as near/far. But do you mean that there’s an up/down gradient, which moves with the camera and shouldn’t? If so, I’d think adjusting o.screenPos to use world y instead of local camera-y might do something.

It seems that it’s a Matrix problem

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