I am working on my own deffered rendering engine. I am rendering the scene to the g-buffer containing diffuse color, view space normals and depth (for now). I have implemented directional light for the second rendering stage and it works great. Now I want to render a point light, which is a bit harder.
I need the point light position for the shader in view space because I have only depth in the g-buffer and I can't afford a matrix multiplication in every pixel. I took the light position and transformed it by the same matrix, by which I transform every vertex in shader, so it should align with verices in the scene (using D3DXVec3Transform). But that isn't the case: transformed position doesn't represent viewspace position nearly at all. Its x,y coordinates are off the charts, they are often way out of the (-1,1) range. The transformed position respects the camera orientation somewhat, but the light moves too quick and the y-axis is inverted. Only if the camera is at (0,0,0), the light stands at (0,0) in the center of the screen. Here is my relevant rendering code executed every frame:
D3DXMATRIX matView; // the view transform matrixD3DXMATRIX matProjection; // the projection transform matrixD3DXMatrixLookAtLH(&matView, &D3DXVECTOR3 (x,y,z), // the camera position &D3DXVECTOR3 (xt,yt,zt), // the look-at position &D3DXVECTOR3 (0.0f, 0.0f, 1.0f)); // the up directionD3DXMatrixPerspectiveFovLH(&matProjection, fov, // the horizontal field of view asp, // aspect ratio znear, // the near view-plane zfar); // the far view-planeD3DXMATRIX res=matView*matProjection;eff->SetMatrix("worldViewProj",&res); //vertices are transformed ok ín shader//render g-bufferD3DXVECTOR4 lpos; D3DXVECTOR3 lpos2(0,0,0);D3DXVec3Transform(&lpos,&lpos2,&res); //transforming lpos into lpos2 using res, still the same matrixeff->SetVector("poslight",&lpos); //but there is already a mess in lpos at this time//render the fullscreen quad with wrong lightingNot that relevant shader code, but still, I see the light position this way (passing IN.texture is just me being lazy):
float dist=length(float2(IN.texture0*2-1)-float2(poslight.xy));OUT.col=tex2D(Sdiff,IN.texture0)/dist;Can you please take a look at the code and tell me where the mistake is? It seems to me it should work ok, but it doesn't. Thanks in advance.
Edited by Brejlounek, 14 January 2013 - 04:16 PM.