8

在背面剔除中,您可以使用面法线来查看面是否指向您的相机,如果三角形是顺时针绘制还是逆时针绘制,您可以做一些技巧。

我对顺时针方向的这种技术感到困惑。似乎使用这种方法,发送到显卡的顶点数据的顺序决定了它是面向还是远离相机。我不明白这有什么意义,因为相机可以朝任何方向看,就好像顶点数据必须根据相机位置而改变,而这显然不是在 CPU 上完成的。

我怎么能理解这个?

4

3 回答 3

13

这是从对边看的一个三角形:

顺时针与逆时针

3D 空间中的 3 个点定义了一个三角形。此外,如果这些点是有序的(如这里),它们还确定三角形的两个边(面):顺时针和逆时针(它们由放置在面内的顺序时钟确定,将指向其顶点)

在上面的例子中,三角形是逆时针纹理的

现在想象这个三角形是骰子的一个元素:

ccw 纹理盒

如果你掷骰子(或围绕它旋转相机),我们的逆时针三角形变成顺时针,我们不希望它再有纹理了。

这个骰子实际上是由 12 个这样的三角形组成的,如果我们对它们进行正确排序,我们将一次只对 6 个面向相机的纹理进行纹理处理。

于 2013-02-23T14:55:14.630 回答
5

我将在一个示例四边形上向您展示:

  (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 特定的东西有一些很好的解释,这在今天仍然很相关。

于 2013-02-23T14:47:14.950 回答
1

这正是重点:当您创建/绘制面部时,顶点顺序最初与相机方向无关!请注意,相机只是一种变换,而不是由 openGL 本身识别的东西。
因此,在渲染时,在您通过相机“观看”之后,openGL 只需检查(如果启用了剔除)面顶点的新顺序,现在根据新方向(在应用所有变换之后),以显示与否。

于 2014-03-15T08:05:52.317 回答