Implement Reverse Z projection matrix for skin model

Signed-off-by: Dylan Schooner <dschooner05@gmail.com>
This commit is contained in:
Dylan Schooner
2025-10-31 12:20:28 -04:00
parent 2982e6e7c9
commit b488547054
5 changed files with 85 additions and 24 deletions

View File

@@ -1,6 +1,7 @@
<RCC>
<qresource prefix="/shaders">
<file>vshader.glsl</file>
<file>vshader_skin_model.glsl</file>
<file>vshader_skin_background.glsl</file>
<file>fshader.glsl</file>
</qresource>
</RCC>

View File

@@ -0,0 +1,11 @@
attribute vec4 a_position;
attribute vec2 a_texcoord;
varying vec2 v_texcoord;
void main()
{
gl_Position = a_position;
v_texcoord = a_texcoord;
}

View File

@@ -1,6 +1,12 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
// https://code.qt.io/cgit/qt/qtbase.git/tree/examples/opengl/cube/vshader.glsl
// Dylan Schooner - 2025
// Modification: Implemented final Z-NDC re-inversion to compensate
// for rigid OpenGL 2.0 context forcing glClearDepth(1.0).
// This flips the high-precision Reverse Z output to the standard [0, W] range.
#ifdef GL_ES
// Set default precision to medium
precision mediump int;
@@ -20,6 +26,11 @@ void main()
// Calculate vertex position in screen space
gl_Position = mvp_matrix * model_matrix * a_position;
// Invert the z component of our Reverse Z matrix back to standard NDC
float near_z = gl_Position.z;
float w_c = gl_Position.w;
gl_Position.z = w_c - near_z;
// Pass texture coordinate to fragment shader
// Value will be automatically interpolated to fragments inside polygon faces
v_texcoord = a_texcoord;