Jump to content

  • Log In with Google      Sign In   
  • Create Account


Calculating view space point light position


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 Brejlounek   Members   -  Reputation: 156

Like
0Likes
Like

Posted 14 January 2013 - 04:05 PM

Hi there,

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 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.

Edited by Brejlounek, 14 January 2013 - 04:16 PM.


Sponsor:

#2 SIIYA   Members   -  Reputation: 465

Like
0Likes
Like

Posted 16 January 2013 - 07:13 AM

It seems that you are transforming light position into projection space. You should multiply light position by matView not res.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS