godotengine / godot

Godot Engine – Multi-platform 2D and 3D game engine
https://godotengine.org
MIT License
86.49k stars 19.27k forks source link

Geometry not rendering correctly in right eye in WMR headset with Compatibility renderer #93921

Open skyace65 opened 3 days ago

skyace65 commented 3 days ago

Tested versions

System information

Godot v4.3.beta2 - Windows 10.0.19045 - GLES3 (Compatibility) - AMD Radeon RX 6950 XT (Advanced Micro Devices, Inc.; 31.0.24033.1003) - AMD Ryzen 7 3700X 8-Core Processor (16 Threads)

Issue description

I noticed this when testing the hand tracking demo. In this specific project, when using the compatibility renderer Geometry is not rendered to the right eye of my VR headset. Mobile and Forward+ Will render geometry correctly

HandIssue

I wanted to try recreating this with a different project so I used the XR Tools Demo. I'm getting GDScript errors when opening most of the actual scenes, So I added a cube to the title scene and the cube is rendering in the right eye, but it's behind the text which is incorrect. I'm guessing there's something unique about how that scene is setup causing this to behave differently.

Issue Part 2

I also tested this scene in Godot 4.2 and the issue did not happen.

I'm using a Samsung Odyssey+ (WMR) and Steam VR. If I change to the mobile renderer everything is fine in the right eye. My AMD Graphics Driver is on the latest available version (24.5.1). Other people who tested the demo have not reported this issue, based on that I'm assuming this is either specific to WMR headsets or AMD Graphics Cards in some way.

Steps to reproduce

Open Any OpenXR project (Using the compatibility renderer) with a WMR headset and or AMD Graphics card and look at Geometry

Minimal reproduction project (MRP)

The OpenXR hand tracking demo from this PR: https://github.com/godotengine/godot-demo-projects/pull/973

BastiaanOlij commented 3 days ago

I wonder if this is in any way related to our Reverse-Z changes. That when clearing the Z buffer it's only writing the correct depth in the left eye layer and zeroing it out in the right eye layer. The text renders because it might be ignoring depth.

If you can do a frame capture in renderdoc you could have a look at the content of the depth buffer right after its cleared. I suspect that the left image will show white (or red) and the right image black.

edit Hmm, come to think of it, that would result in the sky not rendering as well so I'm probably wrong.