什么是openGL中的顺时针面

Posted

技术标签:

【中文标题】什么是openGL中的顺时针面【英文标题】:what is a clockwise face in openGL 【发布时间】:2013-02-09 02:15:45 【问题描述】:

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

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

我怎么理解这个?

【问题讨论】:

关于 math.SE 的相关问题:math.stackexchange.com/questions/297588/… 【参考方案1】:

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

  (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 特定内容的很好的解释,这在今天仍然很相关。

【讨论】:

所以顺序,无论是 CW 还是 CCW,都会告诉 GPU 哪一边是前面,但我不明白这是怎么可能的,因为相机方向决定了人脸是朝前还是朝外。 这就是重点。如果你从后面“看”面,在绘图时可以简单地忽略它们,因为它们肯定会被正面遮住(透明模型是一个例外 - 在这种情况下,正面和背面都必须是绘制)。【参考方案2】:

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

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

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

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

如果你掷骰子(或围绕它旋转相机),我们的三角形从 CCW 变为 CW,我们不希望它再被纹理化。

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

【讨论】:

只是想补充一点,这也称为 chirality,或称手性,坐标系的手性也决定了法线指向的方向,具体取决于按照将向量放入叉积中的顺序。声明a×b = -b×a 始终成立,但翻转手性具有相同的效果。 所以顺序,无论是 CW 还是 CCW,都会告诉 GPU 哪一边是前面,但我不明白这是怎么可能的,因为相机方向决定了人脸是朝前还是朝外。 完全正确。这就是重点。上图左侧的摄像头位于三角形的“后面”,而在右侧的位置,它位于三角形的“前面”。并且您只想对一侧进行纹理处理。 为您添加了额外的图像。【参考方案3】:

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

【讨论】:

以上是关于什么是openGL中的顺时针面的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 2.0 卷绕和背面剪裁

全局变量的顺序改变了 C++/OpenGL 中的性能

OpenGL图像渲染过程3.0

当我在网格/面中实现索引时,为啥它会返回 OpenGL 错误?

OpenGL - 旋转 180 度后对象反转

OpenGL学习笔记多边形绘制