背面剔除错误(在世界空间)

我编写简单的软件渲染器。 在我的管道中,我有背面剔除的阶段。

但看起来有一些错误。

在世界转变之后立即进行扑杀(这是否正确?)。

Vector3F view_dir(0.0f, 0.0f, 1.0f); std::vector<Triangle> to_remove; for (Triangle &t : m_triangles) { Vector4F e1 = t.v2 - t.v1; Vector4F e2 = t.v3 - t.v1; Vector3F normal( e1.y * e2.z - e1.z * e2.y, e1.z * e2.x - e1.x * e2.z, e1.x * e2.y - e1.y * e2.x ); normal.Normalize(); float dot = Dot(view_dir, normal); if (dot <= 0) to_remove.push_back(t); } for (Triangle& t : to_remove) m_triangles.erase(std::remove(m_triangles.begin(), m_triangles.end(), t), m_triangles.end()); 

相机坐在原点,并在屏幕(RH)点。

是什么原因?

已更新:仅当三角形的原点偏移量为非零时才会出现错误

更新2:如果我在剪辑空间中处理背面剔除(在用视图和投影matrix转换所有顶点之后),并且只检查三角形的正常的z坐标 – 它工作完美…我可以执行前视图/ proj转换吗? 在这种情况下,看起来剔除将不取决于投影,这是不正确的?

我有以下错误:视图的方向总是被保持不变,而它应该被视为相机的位置和多边形(或其中心)的一个点之间的差异。 否则它不会是透视正确的。 我不会从原点的零偏移得到这个错误,因为在这种情况下,正确的视图方向是(0,0,1)。

所以工作代码看起来像这样:

 // Calculate view position from view matrix Vector4F view_pos = m_view_transform * Vector4F(0.0f, 0.0f, 0.0f, 1.0f); std::vector<Triangle> to_remove; for (Triangle &t : m_triangles) { Vector4F e1 = t.v2 - t.v1; Vector4F e2 = t.v3 - t.v1; Vector4F normal( e1.y * e2.z - e1.z * e2.y, e1.z * e2.x - e1.x * e2.z, e1.x * e2.y - e1.y * e2.x, 0.0f); // Calculate actual direction Vector4F view_dir = t.v1 - view_pos; view_dir.Normalize(); float dot = Dot(view_dir, normal); if (dot <= 0) to_remove.push_back(t); } for (Triangle& t : to_remove) m_triangles.erase(std::remove(m_triangles.begin(), m_triangles.end(), t), m_triangles.end()); 

另外,看起来没有理由在世界空间中进行背面剔除 – 它可以在物体空间中完成,并且可以帮助提高性能。 有关前端背面剔除的更多信息,请参阅此页面: http ://www.gamasutra.com/view/feature/131773/a_compact_method_for_backface_.php?print =1

希望这将有助于未来的人:)