Top of the line vs Old crap

Started by
31 comments, last by riuthamus 11 years, 3 months ago

I'm not using the values in the depthbuffer just for outputting depth in a pre-pass so I cannot say how it behaves when using it as a depthbuffer value. Did you try to change the ZFunc-state in the geometry pass? Thats pretty unlikely but I will also have a look into my depth texture with pix maybe the values are reversed

Advertisement

You don't need to keep view space position for the logarithmic depth. You can use the value of w, since it contains the view space depth after projection:


output.Position.z = log(0.001 * output.Position.w + 1) / log(0.001 * FarPlane + 1) * output.Position.w;

That's because the projection matrix (D3DXMatrixPerspectiveFovLH) is:


w       0       0               0
0       h       0               0
0       0       zf/(zf-zn)      1
0       0       -zn*zf/(zf-zn)  0

And thus w ? z, w ends up with the view space depth.

Hmm. Well if I change it to output.Position.w, I can see the terrain again, but it's back to rendering the light weirdly. The strange thing I notice is when I debug the pixel shader, the reconstructed position always seems to be behind me. So for example the Y value of the light (which is in front of me) is 570 and the pixel I'm debugging is past that when I'm looking down, so you'd expect a Y < 570 but instead it comes out as 608. This happens regardless of whether I use -depth or depth in the invProjPos calculation.

I dont get it. It's always the same, using output.Position.z or output.Position.w makes no difference. The light is only visible from inside the volume. I'm pretty sure I just missing a additional math operation but I dont see it and I need fresh view. So I will look into it later that evening (it's about 1pm here) so hopefully I get more for you tonight or tomorrow.

Any luck my friend?

Not yet but I'm still on it

Ok here is my next try. I knew I missed something and I hope I finally got it.
First of all I'm using the output.Position.w value for the depth now so it looks like this:


output.Position.z = log(output.Position.w*0.001f + 1) / log(0.001f*FarPlane +1) * output.Position.w;

And here is the reconstruction code:


float4 mapValue = tex2D(DepthMapSampler, PSIn.texCoord + dimensionOffset);
float depth = mapValue.x;
depth = ((pow((0.001 * FarPlane) + 1, depth) - 1) / 0.001);
depth /=  (NearPlane*FarPlane/(FarPlane-NearPlane));
PSIn.ProjPos.xy *= depth;
float4 invProjPos = mul(PSIn.ProjPos ,xInvProjection);
invProjPos.z = -depth;
float4 worldPos = mul(invProjPos, xInvView);
worldPos /= worldPos.w;

The thing I missed was the division. Cameni gave me the hint when he said the w-component contains the view space depth and he is right it contains it but is not equal to it due to the projection matrix multiplication so you need to extract it before you can use it. Be careful with the signs. I'm using a right handed projection Matrix and I think you need to change them when using a lefthanded. It should be enough to add a negativ sign to the division.

Wow, it actually works. I think that last line, the worldPos /= worldPos.w was the key. The depth /= (NearPlane*FarPlane/(FarPlane-NearPlane)) line doesn't seem to have any effect that I can notice though. Thanks for you help!

Hmm strange, for me it's not lighting anything without that line but however I'm glad it's finally working.

Indeed, good to have it working. Now to get it to work and make it all sexy like! :P

This topic is closed to new replies.

Advertisement