Hi guys! I need to reconstruct World Position from depth buffer.I ve find some docs so its like you make it different ways.I prefer the way its used in Crysis. The main idea is to render out normalized view-space z as our depth and then convert it to Wpos. So there is two shaders - one is for all geometry and other is for screen quad.
// In object shader:
matrix WorldViewMat:WorldView;
matrix WorldVP:WorldViewProjection;
//this is camera far range
float g_fFarClip=25000;
Out_Geometry VS_Geometry(In_Geometry IN) { Out_Geometry OUT;
OUT.Pos = mul(IN.Pos, WorldVP);
float4 vPositionVS = mul(IN.Pos, WorldViewMat);
//output view-space z
OUT.Depth = vPositionVS.z;
return OUT; }
float4 PS_Geometry(Out_Geometry IN) : COLOR {
return float4(1,1,1,-IN.Depth/g_fFarClip); }
// In quad shader:
matrix ViewProjInverse;
float2 ViewSize1;
//this is camera far range
float g_fFarClip=25000;
OutPut VS(InPut IN) { OutPut OUT;
OUT.Pos=IN.Pos;
OUT.CamViewPos = mul(IN.Pos, ViewProjInverse);
//just uv for quad
OUT.Tex1=((float2(IN.Pos.x,-IN.Pos.y)+1.0)*0.5)+ViewSize1;
return OUT; }
float4 PS_Quad(OutPut IN) : COLOR {
float3 vFrustumRayVS = IN.CamViewPos.xyz * (g_fFarClip/-IN.CamViewPos.z);
//depth sample
WPos.xyz = tex2D(GeometrySampler,IN.Tex1).w * vFrustumRayVS;
return float4(WPos.xyz,1); }
The reconstruction looks correct only when main camera is in 0,0,0 coordinates.I think there is errors in quad shader.
PS
ViewProjInverse matrix which is used is set up from DBPro :
set current camera Main_Camera
view matrix4 AL_Matrix(1)
projection matrix4 AL_Matrix(2)
multiply matrix4 AL_Matrix(3),AL_Matrix(1),AL_Matrix(2)
null=inverse matrix4(AL_Matrix(4),AL_Matrix(3))
set effect constant matrix QuadEffect,"ViewProjInverse",AL_Matrix(4)
I hope my code and comments are undestandable

Thanks