浏览代码

LibGL: Fix triangle winding calculation

Since we operate in screen space where y points down we need to reverse
what is considered clock wise and what is considered counter clockwise.

The rasterizer always expects triangles with a consistent winding order
thus swap 2 vertices if necessary to reverse the winding before passing
the triangle on to the rasterization stage.
Stephan Unverwerth 3 年之前
父节点
当前提交
addbcd42d7
共有 2 个文件被更改,包括 6 次插入2 次删除
  1. 1 1
      Userland/Applications/3DFileViewer/main.cpp
  2. 5 1
      Userland/Libraries/LibGL/SoftwareGLContext.cpp

+ 1 - 1
Userland/Applications/3DFileViewer/main.cpp

@@ -60,7 +60,7 @@ private:
         start_timer(20);
 
         GL::make_context_current(m_context);
-        glFrontFace(GL_CW);
+        glFrontFace(GL_CCW);
         glEnable(GL_CULL_FACE);
         glEnable(GL_DEPTH_TEST);
 

+ 5 - 1
Userland/Libraries/LibGL/SoftwareGLContext.cpp

@@ -246,7 +246,7 @@ void SoftwareGLContext::gl_end()
             continue;
 
         if (m_cull_faces) {
-            bool is_front = (m_front_face == GL_CCW ? area > 0 : area < 0);
+            bool is_front = (m_front_face == GL_CCW ? area < 0 : area > 0);
 
             if (is_front && (m_culled_sides == GL_FRONT || m_culled_sides == GL_FRONT_AND_BACK))
                 continue;
@@ -255,6 +255,10 @@ void SoftwareGLContext::gl_end()
                 continue;
         }
 
+        if (area > 0) {
+            swap(triangle.vertices[0], triangle.vertices[1]);
+        }
+
         m_rasterizer.submit_triangle(triangle, m_texture_units);
     }