Stereo when using an infinity projection matrix

Started by
0 comments, last by Pthalicus 11 years, 1 month ago

I am rendering a skydome using an infinity projection matrix and I want to move the final image left and right by a certain amount of pixels which I already know so it appears at the max parallax.

I could render it to a slightly larger framebuffer and then move that however I was wondering if there was a way of doing this (possibly by changing the infinity projection matrix)?

Below is the code used to generate the infinity projection matrix:

buildProjectionMatrixInfinityPerspectiveFovLH(f32 aspectRatio)

{

const f64 yScale = 1.0f / tan(45.0f / 2.0f);

const T xScale = (T)(yScale / aspectRatio);

const T Epsilon = 0.000001f;

M[0] = xScale;

M[1] = 0;

M[2] = 0;

M[3] = 0;

M[4] = 0;

M[5] = (T)yScale;

M[6] = 0;

M[7] = 0;

M[8] = 0;

M[9] = 0;

M[10] = 1.0f+Epsilon;

M[11] = 1.0f;

M[12] = 0;

M[13] = 0;

M[14] = -1.0f;

M[15] = 0;

definitelyIdentityMatrix=

false;

return *this;

}

Thanks.

Advertisement

I haven't tested this with your "infinity matrix", however, this works fine with a regular good'ol non-orthograpic projection matrix:


void buildProjectionMatrixInfinityPerspectiveFovLH(f32 aspectRatio, f32 parallax)
{
   const f64 yScale = 1.0f / tan(45.0f / 2.0f);
   const T xScale = (T)(yScale / aspectRatio);
   const T Epsilon = 0.000001f;
   M[0] = xScale;
   M[1] = 0;
   M[2] = 0; 
   M[3] = 0;
   M[4] = 0;
   M[5] = (T)yScale;
   M[6] = 0;
   M[7] = 0;
   M[8] = 0;
   M[9] = parallax; // Parallax shift 
   M[10] = 1.0f+Epsilon;
   M[11] = 1.0f;
   M[12] = 0;
   M[13] = 0;
   M[14] = -1.0f;
   M[15] = 0;
   definitelyIdentityMatrix=false;

   return *this;
}

So you'd obviously want two projection matrices:



f32 parallax = 0.033f; //  Real-world value: dependant on screen SIZE (not dimensions), and user's viewing distance to screen.

matrix left = buildProjectionMatrixInfinityPerspectiveFovLH(aspectRatio, -parallax);
matrix right = buildProjectionMatrixInfinityPerspectiveFovLH(aspectRatio, parallax);

Note: The parallax should match the viewer's eye seperation from their viewing distance, take into account the real-world dimensions of the screen, and account for the viewer's distance to the screen - if you want a realistic experience.

However, this is largely impossible unless you're using a head mounted display - where the viewing distance is constant.

You could just tweak the parallax value to see what feels best. :)

Saving the world, one semi-colon at a time.

This topic is closed to new replies.

Advertisement