fix: transpose matrices for OpenGL (row-major → column-major)

System.Numerics.Matrix4x4 is row-major, OpenGL UniformMatrix4 with
transpose=false expects column-major. Changed all UniformMatrix4 calls
to transpose=true. Also explicitly enable depth test + disable cull face
for main pass. Fixes strobe/flickering issue.
This commit is contained in:
emil28092005
2026-06-17 20:55:59 +03:00
parent 417915e861
commit 07754a31bf
+6 -4
View File
@@ -130,7 +130,7 @@ public sealed class OpenGLRenderer : IRenderer
unsafe unsafe
{ {
fixed (float* p = _matrixBuffer) fixed (float* p = _matrixBuffer)
_gl.UniformMatrix4(shadowMvpLoc, 1, false, p); _gl.UniformMatrix4(shadowMvpLoc, 1, true, p);
} }
DrawMeshImmediate(glMesh); DrawMeshImmediate(glMesh);
}); });
@@ -141,6 +141,8 @@ public sealed class OpenGLRenderer : IRenderer
// === PASS 2: Main render === // === PASS 2: Main render ===
_gl.Viewport(0, 0, (uint)_screenWidth, (uint)_screenHeight); _gl.Viewport(0, 0, (uint)_screenWidth, (uint)_screenHeight);
_gl.Enable(GLEnum.DepthTest);
_gl.Disable(GLEnum.CullFace);
_gl.ClearColor(0.098f, 0.118f, 0.157f, 1); _gl.ClearColor(0.098f, 0.118f, 0.157f, 1);
_gl.Clear((uint)(GLEnum.ColorBufferBit | GLEnum.DepthBufferBit)); _gl.Clear((uint)(GLEnum.ColorBufferBit | GLEnum.DepthBufferBit));
_gl.UseProgram(_program); _gl.UseProgram(_program);
@@ -168,7 +170,7 @@ public sealed class OpenGLRenderer : IRenderer
unsafe unsafe
{ {
fixed (float* p = _matrixBuffer) fixed (float* p = _matrixBuffer)
_gl.UniformMatrix4(_uLightViewProj, 1, false, p); _gl.UniformMatrix4(_uLightViewProj, 1, true, p);
} }
_gl.ActiveTexture(GLEnum.Texture1); _gl.ActiveTexture(GLEnum.Texture1);
_gl.BindTexture(GLEnum.Texture2D, _shadowTexture); _gl.BindTexture(GLEnum.Texture2D, _shadowTexture);
@@ -185,9 +187,9 @@ public sealed class OpenGLRenderer : IRenderer
var mvp = proj * view * model; var mvp = proj * view * model;
CopyMatrixToBuffer(mvp); CopyMatrixToBuffer(mvp);
unsafe { fixed (float* pmvp = _matrixBuffer) _gl.UniformMatrix4(_uMVP, 1, false, pmvp); } unsafe { fixed (float* pmvp = _matrixBuffer) _gl.UniformMatrix4(_uMVP, 1, true, pmvp); }
CopyMatrixToBuffer(model); CopyMatrixToBuffer(model);
unsafe { fixed (float* pmodel = _matrixBuffer) _gl.UniformMatrix4(_uModel, 1, false, pmodel); } unsafe { fixed (float* pmodel = _matrixBuffer) _gl.UniformMatrix4(_uModel, 1, true, pmodel); }
_gl.Uniform4(_uMaterialColor, material.Albedo.X, material.Albedo.Y, material.Albedo.Z, 1.0f); _gl.Uniform4(_uMaterialColor, material.Albedo.X, material.Albedo.Y, material.Albedo.Z, 1.0f);
_gl.Uniform1(_uRoughness, material.Roughness); _gl.Uniform1(_uRoughness, material.Roughness);
_gl.Uniform1(_uMetallic, material.Metallic); _gl.Uniform1(_uMetallic, material.Metallic);