- Calculate Z matching D3D9 docs (combined with Xbox depth scaling)

- Normalize Z from either (0, 1) or (0, zbuffer depth)
This commit is contained in:
Anthony 2020-11-24 22:57:55 +13:00 committed by PatrickvL
parent b2ca28198e
commit 95b97b0502
1 changed files with 8 additions and 9 deletions

View File

@ -4180,11 +4180,11 @@ void GetXboxViewportOffsetAndScale(float (&vOffset)[4], float(&vScale)[4])
auto zRange = g_Xbox_Viewport.MaxZ - g_Xbox_Viewport.MinZ;
vScale[0] = scaledWidth / 2;
vScale[1] = -scaledHeight / 2;
vScale[2] = zRange > 0 ? g_ZScale / zRange : g_ZScale; // avoid divide by 0 when MinZ == MaxZ
vScale[2] = zRange * g_ZScale;
vScale[3] = 1;
vOffset[0] = scaledWidth / 2 + scaledX;
vOffset[1] = scaledHeight / 2 + scaledY;
vOffset[2] = -g_Xbox_Viewport.MinZ;
vOffset[2] = g_Xbox_Viewport.MinZ * g_ZScale;
vOffset[3] = 0;
}
@ -4195,11 +4195,6 @@ void CxbxUpdateHostViewPortOffsetAndScaleConstants()
float vScaleOffset[2][4]; // 0 - scale 1 - offset
GetXboxViewportOffsetAndScale(vScaleOffset[1], vScaleOffset[0]);
if (g_Xbox_VertexShader_IsPassthrough) {
// Passthrough should not scale Z
// Test case: DoA3 character select
vScaleOffset[0][2] = 1.0f;
}
// Xbox outputs vertex positions in rendertarget pixel coordinate space, with non-normalized Z
// e.g. 0 < x < 640 and 0 < y < 480
@ -4220,8 +4215,12 @@ void CxbxUpdateHostViewPortOffsetAndScaleConstants()
float xboxScreenspaceWidth = xboxRenderTargetWidth * screenScaleX;
float xboxScreenspaceHeight = xboxRenderTargetHeight * screenScaleY;
float screenspaceScale[4] = { xboxScreenspaceWidth / 2, -xboxScreenspaceHeight / 2, vScaleOffset[0][2], 1 };
float screenspaceOffset[4] = { xboxScreenspaceWidth / 2 + aaOffsetX, xboxScreenspaceHeight / 2 + aaOffsetY, vScaleOffset[1][2], 0 };
// Passthrough should range 0 to 1, instead of 0 to zbuffer depth
// Test case: DoA3 character select
float zOutputScale = g_Xbox_VertexShader_IsPassthrough ? 1 : g_ZScale;
float screenspaceScale[4] = { xboxScreenspaceWidth / 2, -xboxScreenspaceHeight / 2, zOutputScale, 1 };
float screenspaceOffset[4] = { xboxScreenspaceWidth / 2 + aaOffsetX, xboxScreenspaceHeight / 2 + aaOffsetY, 0, 0 };
g_pD3DDevice->SetVertexShaderConstantF(CXBX_D3DVS_SCREENSPACE_SCALE_BASE, screenspaceScale, CXBX_D3DVS_NORMALIZE_SCALE_SIZE);
g_pD3DDevice->SetVertexShaderConstantF(CXBX_D3DVS_SCREENSPACE_OFFSET_BASE, screenspaceOffset, CXBX_D3DVS_NORMALIZE_OFFSET_SIZE);