From 07754a31bffeb3a4643be1a95bb0c3d2d68f8b51 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Wed, 17 Jun 2026 20:55:59 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20transpose=20matrices=20for=20OpenGL=20(r?= =?UTF-8?q?ow-major=20=E2=86=92=20column-major)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- src/Engine.Graphics.OpenGL/OpenGLRenderer.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Engine.Graphics.OpenGL/OpenGLRenderer.cs b/src/Engine.Graphics.OpenGL/OpenGLRenderer.cs index e51347c..2bd16cc 100644 --- a/src/Engine.Graphics.OpenGL/OpenGLRenderer.cs +++ b/src/Engine.Graphics.OpenGL/OpenGLRenderer.cs @@ -130,7 +130,7 @@ public sealed class OpenGLRenderer : IRenderer unsafe { fixed (float* p = _matrixBuffer) - _gl.UniformMatrix4(shadowMvpLoc, 1, false, p); + _gl.UniformMatrix4(shadowMvpLoc, 1, true, p); } DrawMeshImmediate(glMesh); }); @@ -141,6 +141,8 @@ public sealed class OpenGLRenderer : IRenderer // === PASS 2: Main render === _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.Clear((uint)(GLEnum.ColorBufferBit | GLEnum.DepthBufferBit)); _gl.UseProgram(_program); @@ -168,7 +170,7 @@ public sealed class OpenGLRenderer : IRenderer unsafe { fixed (float* p = _matrixBuffer) - _gl.UniformMatrix4(_uLightViewProj, 1, false, p); + _gl.UniformMatrix4(_uLightViewProj, 1, true, p); } _gl.ActiveTexture(GLEnum.Texture1); _gl.BindTexture(GLEnum.Texture2D, _shadowTexture); @@ -185,9 +187,9 @@ public sealed class OpenGLRenderer : IRenderer var mvp = proj * view * model; 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); - 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.Uniform1(_uRoughness, material.Roughness); _gl.Uniform1(_uMetallic, material.Metallic);