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. It's 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 direction D3DXMatrixPerspectiveFovLH(&matProjection, fov, // the horizontal field of view asp, // aspect ratio znear, // the near view-plane zfar); // the far view-plane D3DXMATRIX vysl=matView*matProjection;eff->SetMatrix("worldViewProj",&vysl); //vertices are transformed ok ín shader //render g-buffer D3DXVECTOR4 lpos; D3DXVECTOR3 lpos2(0,0,0); D3DXVec3Transform(&lpos,&lpos2,&vysl); //transforming lpos into lpos2 using vysl, still the same matrix eff->SetVector("poslight",&lpos); //but there is already a mess in lpos at this time //render the fullscreen quad with wrong lighting
Not 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.
P,S, . Sorry for second same topic, my fault, I can't get rid of the old one.