在背面剔除中,您可以使用面法线来查看面是否指向您的相机,如果三角形是顺时针绘制还是逆时针绘制,您可以做一些技巧。
我对顺时针方向的这种技术感到困惑。似乎使用这种方法,发送到显卡的顶点数据的顺序决定了它是面向还是远离相机。我不明白这有什么意义,因为相机可以朝任何方向看,就好像顶点数据必须根据相机位置而改变,而这显然不是在 CPU 上完成的。
我怎么能理解这个?
这是从对边看的一个三角形:
3D 空间中的 3 个点定义了一个三角形。此外,如果这些点是有序的(如这里),它们还确定三角形的两个边(面):顺时针和逆时针(它们由放置在面内的顺序时钟确定,将指向其顶点)
在上面的例子中,三角形是逆时针纹理的
现在想象这个三角形是骰子的一个元素:
如果你掷骰子(或围绕它旋转相机),我们的逆时针三角形变成顺时针,我们不希望它再有纹理了。
这个骰子实际上是由 12 个这样的三角形组成的,如果我们对它们进行正确排序,我们将一次只对 6 个面向相机的纹理进行纹理处理。
我将在一个示例四边形上向您展示:
(0,0)-------(1,0)
| |
| X |
| |
(0,1)-------(1,1)
假设我们从(0,0)
. 现在,如果您以“顺时针”顺序缠绕(通过)顶点,下一个将(1,0)
是(1,1)
和(0,1)
。(1,0)
或多或少在 2 点钟,(1,1)
4 点钟,依此类推。
因此 GPU 内存中的数据:0,0, 1,0, 1,1, 0,1
.
当您将卷绕方向与您的设置相关联时,您可以轻松区分什么是“正面”和“背面” - 为了更好地想象,您可以将它画在透明的东西上,然后从另一侧看 - 卷绕方向将是逆转。
所以上卷方向的规范只是告诉GPU哪一边是前面,哪一边是后面,因为它不能自己做——三角形的两边都一样好,给定多边形的法向量可以要么是N
要么-N
。但是,GPU 可以验证它们中的哪些与正确的结束顺序对齐。
The (Old) Red Book 的第 2 章对 OpenGL 特定的东西有一些很好的解释,这在今天仍然很相关。
这正是重点:当您创建/绘制面部时,顶点顺序最初与相机方向无关!请注意,相机只是一种变换,而不是由 openGL 本身识别的东西。
因此,在渲染时,在您通过相机“观看”之后,openGL 只需检查(如果启用了剔除)面顶点的新顺序,现在根据新方向(在应用所有变换之后),以显示与否。