Use GL viewport clipping for stereo parallax image shift adjustments.

Equivalent to legacy Descent 1.5 pixel shift methods for stereo formats.
Since Descent is rendering viewpoint differences for left/right eyes,
pixel shifting via display viewport is sufficient adjustment.

Since OGL layer here is essentially handling display output surfaces,
the OGL projection transform is not useful for stereo parallax effects
as when used for 3D scenes.
This commit is contained in:
Dave Milici 2021-03-11 11:25:21 -08:00
parent 8c8b7419b6
commit 4ca5f63b49

View file

@ -1309,7 +1309,7 @@ void ogl_start_frame(grs_canvas &canvas)
ogl_stereo_viewport[1][0] += ogl_stereo_viewport[0][2]; // x = w/2
// half-height viewports for above/below format
else if (VR_half_height)
ogl_stereo_viewport[0][1] -= ogl_stereo_viewport[0][3]; // y = h/2
ogl_stereo_viewport[1][1] -= ogl_stereo_viewport[0][3]; // y = h/2
// center unsqueezed side-by-side format
if (VR_half_width && VR_half_height) {
@ -1320,8 +1320,9 @@ void ogl_start_frame(grs_canvas &canvas)
void ogl_stereo_frame(int xeye, int xoff)
{
float dxeye = 0.0f; // f2fl(xeye);
float dxoff = xoff * 2.0f / grd_curscreen->sc_canvas.cv_bitmap.bm_w;
// float dxeye = 0.0f; // f2fl(xeye);
// float dxoff = xoff * 2.0f / grd_curscreen->sc_canvas.cv_bitmap.bm_w;
int dx = (xoff < 0) ? -xoff : 0;
if (!VR_stereo)
return;
@ -1331,11 +1332,11 @@ void ogl_stereo_frame(int xeye, int xoff)
if (ogl_stereo_enabled)
glDrawBuffer(GL_BACK_LEFT);
else
glViewport(ogl_stereo_viewport[0][0], ogl_stereo_viewport[0][1], ogl_stereo_viewport[0][2], ogl_stereo_viewport[0][3]);
glViewport(ogl_stereo_viewport[0][0]-dx, ogl_stereo_viewport[0][1], ogl_stereo_viewport[0][2]-dx, ogl_stereo_viewport[0][3]);
glMatrixMode(GL_PROJECTION);
ogl_stereo_transform[0][2] += dxeye; // xeye < 0
ogl_stereo_transform[0][3] -= dxoff; // xoff < 0
// ogl_stereo_transform[0][2] += dxeye; // xeye < 0
// ogl_stereo_transform[0][3] -= dxoff; // xoff < 0
glLoadMatrixf(&ogl_stereo_transform[0][0]);
glMatrixMode(GL_MODELVIEW);
}
@ -1344,11 +1345,11 @@ void ogl_stereo_frame(int xeye, int xoff)
if (ogl_stereo_enabled)
glDrawBuffer(GL_BACK_RIGHT);
else
glViewport(ogl_stereo_viewport[1][0], ogl_stereo_viewport[1][1], ogl_stereo_viewport[1][2], ogl_stereo_viewport[1][3]);
glViewport(ogl_stereo_viewport[1][0]+dx, ogl_stereo_viewport[1][1], ogl_stereo_viewport[1][2]-dx, ogl_stereo_viewport[1][3]);
glMatrixMode(GL_PROJECTION);
ogl_stereo_transform[1][2] += dxeye; // xeye > 0
ogl_stereo_transform[1][3] += dxoff; // xoff < 0
// ogl_stereo_transform[1][2] += dxeye; // xeye > 0
// ogl_stereo_transform[1][3] += dxoff; // xoff < 0
glLoadMatrixf(&ogl_stereo_transform[1][0]);
glMatrixMode(GL_MODELVIEW);
}