SpaceWarp - Jittering for most cases fixed

This commit is contained in:
Lubos 2022-06-15 22:25:12 +02:00
parent 2f3506eb2a
commit 46c7e3682a
2 changed files with 14 additions and 17 deletions

View file

@ -367,14 +367,7 @@ void RB_BeginDrawingView (void) {
// ensures that depth writes are enabled for the depth clear
GL_State( GLS_DEFAULT );
// clear relevant buffers
if( VR_RenderMotionVector() )
{
clearBits = 0;
}
else
{
clearBits = GL_DEPTH_BUFFER_BIT;
}
clearBits = GL_DEPTH_BUFFER_BIT;
if ( r_measureOverdraw->integer || r_shadows->integer == 2 )
{

View file

@ -13,7 +13,7 @@
#include <stdlib.h>
#include <string.h>
#define ENABLE_GL_DEBUG 1
#define ENABLE_GL_DEBUG 0
#define ENABLE_GL_DEBUG_VERBOSE 0
#if ENABLE_GL_DEBUG
#include <GLES3/gl32.h>
@ -24,7 +24,7 @@ extern cvar_t *vr_heightAdjust;
extern cvar_t *vr_spacewarp;
XrView* projections;
XrPosef prevInvViewTransform[2];
XrPosef prevXrSpacePoseInWorld;
qboolean fullscreenMode = qfalse;
qboolean stageSupported = qfalse;
qboolean renderMotionVector = qfalse;
@ -315,8 +315,7 @@ void VR_InitRenderer( engine_t* engine ) {
spaceWarpProperties.recommendedMotionVectorImageRectWidth,
spaceWarpProperties.recommendedMotionVectorImageRectHeight);
prevInvViewTransform[0] = XrPosef_Identity();
prevInvViewTransform[1] = XrPosef_Identity();
prevXrSpacePoseInWorld = XrPosef_Identity();
}
void VR_DestroyRenderer( engine_t* engine )
@ -471,11 +470,9 @@ void VR_DrawFrame( engine_t* engine ) {
//
XrFovf fov = {};
XrPosef viewTransform[2];
XrPosef invViewTransform[2];
for (int eye = 0; eye < ovrMaxNumEyes; eye++) {
invViewTransform[eye] = projections[eye].pose;
viewTransform[eye] = XrPosef_Inverse(projections[eye].pose);
fov.angleLeft += projections[eye].fov.angleLeft / 2.0f;
fov.angleRight += projections[eye].fov.angleRight / 2.0f;
@ -493,6 +490,14 @@ void VR_DrawFrame( engine_t* engine ) {
engine->appState.LayerCount = 0;
memset(engine->appState.Layers, 0, sizeof(ovrCompositorLayer_Union) * ovrMaxLayerCount);
// Get pose from game
const XrVector3f axisY = {0.0f, 1.0f, 0.0f};
XrPosef XrSpacePoseInWorld = XrPosef_Identity();
XrSpacePoseInWorld.orientation = XrQuaternionf_CreateFromVectorAngle(axisY, vr.recenterYaw);
XrSpacePoseInWorld.position.x = vr.hmdorigin[0];
XrSpacePoseInWorld.position.y = vr.hmdorigin[1];
XrSpacePoseInWorld.position.z = vr.hmdorigin[2];
XrCompositionLayerProjectionView projection_layer_elements[2] = {};
XrCompositionLayerSpaceWarpInfoFB proj_spacewarp_views[2] = {};
if (!VR_useScreenLayer() && !(cl.snap.ps.pm_flags & PMF_FOLLOW && vr.follow_mode == VRFM_FIRSTPERSON)) {
@ -548,7 +553,7 @@ void VR_DrawFrame( engine_t* engine ) {
proj_spacewarp_views[eye].depthSubImage.imageRect.extent.width = frameBuffer->MotionVectorDepthSwapChain.Width;
proj_spacewarp_views[eye].depthSubImage.imageRect.extent.height = frameBuffer->MotionVectorDepthSwapChain.Height;
proj_spacewarp_views[eye].depthSubImage.imageArrayIndex = eye;
proj_spacewarp_views[eye].appSpaceDeltaPose = XrPosef_Multiply(prevInvViewTransform[eye], viewTransform[eye]);
proj_spacewarp_views[eye].appSpaceDeltaPose = XrPosef_Multiply(prevXrSpacePoseInWorld, XrSpacePoseInWorld);
proj_spacewarp_views[eye].minDepth = 0.0f;
proj_spacewarp_views[eye].maxDepth = 1.0f;
@ -618,8 +623,7 @@ void VR_DrawFrame( engine_t* engine ) {
ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer;
frameBuffer->TextureSwapChainIndex++;
frameBuffer->TextureSwapChainIndex %= frameBuffer->TextureSwapChainLength;
prevInvViewTransform[0] = invViewTransform[0];
prevInvViewTransform[1] = invViewTransform[1];
prevXrSpacePoseInWorld = XrSpacePoseInWorld;
}