Followers 0

# Stereo when using an infinity projection matrix

## 1 post in this topic

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.

0

##### Share on other sites

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

0

## Create an account

Register a new account