Stereoscopic 3D needs fixing

These are not rejected - but are not considered highly important right now.

Moderator: GZDoom Developers

Stereoscopic 3D needs fixing

Postby PaganRaven » Sun Dec 13, 2020 9:37 am

Since the sound stuff for GZDoom is built into the source code now, I'm able to compile a completely functional build for myself!

Yeah, so, I have stereoscopic 3D glasses, and I'm digging that 3D is an actual display feature. But... it wasn't done right.

Let me explain what happens: the screen splits into a splitscreen with a left eye view and a right eye view. Good... except it's all still fullscreen with the resolution settings, meaning the X axis got smooshed on both sides. This is almost negligible on most of the FOV, but it's most noticeable on the HUD in Hexen. (I usually use the classic 320x200 to with no texture filtering for classic authenticity)

Normal 2D view:
Screenshot_Hexen_20201213_101616.png


Stereoscopic 3D view
Screenshot_Hexen_20201213_101452.png

Note that the X axis is chopped in half at each side, narrowing the view, and squeezing the HUD. The wall/pedestal on the right side has completely disappeared from view.

What needs to be done is the Y axis must also be shrunk 50%, with the resolution doubled on both axises. This would have the effect of cinematic black bars taking half the screen as a border on all sides, but it's what must be done.

I want to learn how to code the GZDoom engine, but just getting started is intimidating. The source code is nothing short of labyrinthian. Can someone point me in the direction to where the code files for the 3D views can be found so I can attempt a fix myelf? Or is there already a way to adjust this correctly in the video settings menu somehow?
You do not have the required permissions to view the files attached to this post.
User avatar
PaganRaven
Viking Warrior
 
Joined: 14 Oct 2005

Re: Stereoscopic 3D needs fixing

Postby Rachael » Sun Dec 13, 2020 11:47 am

Unfortunately, this likely never will be fixed, as the original developer for this has mostly gone MIA, and the other developer who's worked with this code has left the project for personal reasons.

I personally do not have any 3d glasses so there isn't much I can do here, so this is going on hold until a developer for this shows up.
User avatar
Rachael
Webmaster
 
Joined: 13 Jan 2004
Discord: Rachael#3767
Twitch ID: madamerachelle
Github ID: madame-rachelle
Operating System: Windows 10/8.1/8/201x 64-bit
OS Test Version: No (Using Stable Public Version)
Graphics Processor: nVidia with Vulkan support

Re: Stereoscopic 3D needs fixing

Postby PaganRaven » Sun Dec 13, 2020 1:02 pm

I guess that translates to "you're on your own."

Well, I plunged into this rat maze looking for cheese and I found src->Common->Rendering->Hardware Renderer->Data->hw_vrmodes.h and hw_vrmodes.cpp.

I found the definition
Code: Select allExpand view
VR_SIDEBYSIDEFULL
which is the thing I want to work with.

This led me to
Code: Select allExpand view
case VR_SIDEBYSIDEFULL:
      return &vrmi_sbsfull;
which I used to trace over to this:
Code: Select allExpand view
static VRMode vrmi_sbsfull = { 2, .5f, 1.f, 2.f,{ { -.5f, .5f },{ .5f, .5f } } };


So, uh, can someone translate that? I'm guessing all the 2s are doubling something, the .5 is cutting a value in half, and the 1f is setting something to normal scale. But... what are each of these arguments? I could trial and error as much as I want but compiling takes a long time.
User avatar
PaganRaven
Viking Warrior
 
Joined: 14 Oct 2005

Re: Stereoscopic 3D needs fixing

Postby PaganRaven » Sun Dec 13, 2020 3:47 pm

I've done some fiddling, and those numbers ABSOLUTELY SHOULD NOT BE CHANGED.
However, this is what they're getting set to
Code: Select allExpand view
void OpenGLFrameBuffer::SetViewportRects(IntRect *bounds)
{
   Super::SetViewportRects(bounds);
   if (!bounds)
   {
      auto vrmode = VRMode::GetVRMode(true);
      vrmode->AdjustViewport(this);
   }
}

What needs to happen is, instead of the screen getting split in half, the resolution of the window should get doubled, but it should render two views with half the window's resolution somehow (so say, you set the resolution to 320x200, the video mode should change to 640x400, but show the left eye at 0x, .5y with 320x200, and the left eye view with 320x200 at 0.5x,0.5y.

So, somewhere after OpenGLFrameBuffer is called, it shoud do something like
Code: Select allExpand view
OpenGLFrameBuffer.SetViewportRect(bounds);
if (VRMode == VR_SIDEBYSIDEFULL)
{
//do the stuff I talked about above
}
User avatar
PaganRaven
Viking Warrior
 
Joined: 14 Oct 2005

Re: Stereoscopic 3D needs fixing

Postby PaganRaven » Sun Dec 13, 2020 8:19 pm

Hey, I actually made progress on fixing this. Only one problem... there's a bunch of old screen in the borders. How do I get rid of that and paint it black?

Screenshot_Hexen_20201213_211535.png


These are the adjustments I made:
Code: Select allExpand view
void FGLRenderer::PresentSideBySide()
{
   mBuffers->BindOutputFB();
   ClearBorders();

   // Compute screen regions to use for left and right eye views
   int leftWidth = screen->mOutputLetterbox.width / 2;
   int rightWidth = screen->mOutputLetterbox.width - leftWidth;
   //vbb added this
   int height = screen->mOutputLetterbox.height / 2;
   int top = height * .5;
   IntRect leftHalfScreen = screen->mOutputLetterbox;
   leftHalfScreen.width = leftWidth;
   //vbb added this
   leftHalfScreen.height = height;
   leftHalfScreen.top = top;
   IntRect rightHalfScreen = screen->mOutputLetterbox;
   rightHalfScreen.width = rightWidth;
   rightHalfScreen.left += leftWidth;
   //vbb added this
   rightHalfScreen.height = height;
   rightHalfScreen.top = top;

   mBuffers->BindEyeTexture(0, 0);
   DrawPresentTexture(leftHalfScreen, true);

   mBuffers->BindEyeTexture(1, 0);
   DrawPresentTexture(rightHalfScreen, true);
}


Code: Select allExpand view
#define isqrt2 0.7071067812f
static VRMode vrmi_mono = { 1, 1.f, 1.f, 1.f,{ { 0.f, 1.f },{ 0.f, 0.f } } };
static VRMode vrmi_stereo = { 2, 1.f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
//vbb fix vr mode
static VRMode vrmi_sbsfull = { 2, 1.f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
//static VRMode vrmi_sbsfull = { 2, 0.5f, 1.f, 2.f,{ { -.5f, 2.f },{ .5f, 2.f } } };
static VRMode vrmi_sbssquished = { 2, .5f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
static VRMode vrmi_lefteye = { 1, 1.f, 1.f, 1.f, { { -.5f, 1.f },{ 0.f, 0.f } } };
static VRMode vrmi_righteye = { 1, 1.f, 1.f, 1.f,{ { .5f, 1.f },{ 0.f, 0.f } } };
static VRMode vrmi_topbottom = { 2, 1.f, .5f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
static VRMode vrmi_checker = { 2, isqrt2, isqrt2, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
You do not have the required permissions to view the files attached to this post.
User avatar
PaganRaven
Viking Warrior
 
Joined: 14 Oct 2005

Re: Stereoscopic 3D needs fixing

Postby Valken » Sun Dec 13, 2020 8:26 pm

I just wanted to comment I am using a poor person's VR setup with a goggle case and mobile phone.

All 3D rendering is squished into a square aspect ratio as the per eye resolution is half of a widescreen format.

But I really like what you are doing to try to preserve the original and correct aspect ratios.

I believe with VR, we simply need 2x WIDESCREENS, for each eye, vs simply halving a widescreen into two squares. All the mainstream VR goggles are like this except for the Primax Wide FOV goggles.
Valken
 
Joined: 08 Jun 2015

Re: Stereoscopic 3D needs fixing

Postby PaganRaven » Sun Dec 13, 2020 8:35 pm

Okay, I figured out that I had to set mOutputLetterbox's top in order to wipe it away.

located in "gl_stereo3.cpp"
Code: Select allExpand view
void FGLRenderer::PresentSideBySide()
{
   mBuffers->BindOutputFB();
   screen->mOutputLetterbox.top = screen->mOutputLetterbox.height;
   
   ClearBorders();
   screen->mOutputLetterbox.top = 0;  //reset so screenshots can be taken

   // Compute screen regions to use for left and right eye views
   int leftWidth = screen->mOutputLetterbox.width / 2;
   int rightWidth = screen->mOutputLetterbox.width - leftWidth;
   //vbb added this
   int height = screen->mOutputLetterbox.height / 2;
   int top = height * .5;
   IntRect leftHalfScreen = screen->mOutputLetterbox;
   leftHalfScreen.width = leftWidth;
   //vbb added this
   leftHalfScreen.height = height;
   leftHalfScreen.top = top;
   IntRect rightHalfScreen = screen->mOutputLetterbox;
   rightHalfScreen.width = rightWidth;
   rightHalfScreen.left += leftWidth;
   //vbb added this
   rightHalfScreen.height = height;
   rightHalfScreen.top = top;

   mBuffers->BindEyeTexture(0, 0);
   DrawPresentTexture(leftHalfScreen, true);

   mBuffers->BindEyeTexture(1, 0);
   DrawPresentTexture(rightHalfScreen, true);
}

Screenshot_Hexen_20201213_213210.png


For some reason, the title screen scales up by like twice its size and you're looking at the top left corner of it as it gets wiped away when you start a new game. I have no idea how that happened, and if it's even anything to do with my coding or just something I randomly did in the video/display settings options.

Edit: Oh yeah, i removed the .ini, and it was definitely my display settings that did that last irrelevant bit.
You do not have the required permissions to view the files attached to this post.
User avatar
PaganRaven
Viking Warrior
 
Joined: 14 Oct 2005


Return to On Hold Suggestions

Who is online

Users browsing this forum: No registered users and 0 guests