什么是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中的顺时针面的主要内容,如果未能解决你的问题,请参考以下文章