cha*_*n00 7 opengl vertex gl-triangle-strip
我正在尝试清除我在三角形条顶点缠绕方向(顺时针和逆时针)看到的一些不一致.我正在OpenGL中绘制一个逆时针旋转90度的梯形.这是相关的代码:
unsigned char mIndices[] = { 0, 1, 2, 3, 4, 5 };
signed short mVertices[] = {
-50, 100, 0, // A
-85, 65, 0, // B
-50, 65, 0, // C
-85, -65, 0, // D
-50, -65, 0, // E
-50, -100, 0, // F
};
...
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_SHORT, 0, mVertices);
...
glDrawElements(GL_TRIANGLE_STRIP, sizeof(mVertices)/sizeof(mVertices[0]), GL_UNSIGNED_BYTE, mIndices);
Run Code Online (Sandbox Code Playgroud)
从我在这里看到的,OpenGL中的默认正面是逆时针方向,这意味着我的条带中的第一个三角形应该有逆时针方向排列的顶点.另外,当绘制三角形条带时,绕组在逆时针和从三角形到三角形的顺时针方向之间切换方向,因此我的顶点以这种方式排序.所以从我的代码中,第一个三角形是ABC,第二个是BCD,第三个CDE和第四个DEF.然而,这篇文章(在OpenGL编程指南的引用中)表示它会将它们绘制为ABC,CBD,CDE,EDF(假设v0-A,v1-B等),这意味着它们都逆时针旋转方向.
如果我从OpenGL规范中正确理解A/B符号,那么三角形都会向相同的方向旋转,但我已经在几个不同的地方看到了变化的绕组.我想这只是一个语义问题,因为产生的形状是相同的,但实际的缠绕顺序是什么?
所以从我的代码中,第一个三角形是ABC,第二个是BCD,第三个CDE和第四个DEF.然而,这篇文章(在OpenGL编程指南的引用中)表示它会将它们绘制为ABC,CBD,CDE,EDF(假设v0-A,v1-B等),这意味着它们都逆时针旋转方向.
他们都说的是真的.从某个角度来看;)
您引用的教程是从顶点提供给光栅化器的顺序的角度来讨论它.这正如所述.光栅化器可以看到单个ABCDEF ...的流.因此,从这个角度来看,光栅化器必须在每个其他三角形上切换其内部缠绕顺序,以匹配用户的意图.
你引用的那本书是从你如何看待这些三角形的顺序的角度来谈论它的.当您按顺序提供它们时,您希望绕组像ABC,CBD,CDE等一样工作.为了实现这一点,您可以按照ABCDEF ...顺序提供它们.
请放心,由三角形条带产生的三角形都以相同的顺序缠绕(否则它将完全混乱,你不能使用简单的东西,如背面剔除或双面渲染),这是三角形条带的神奇之处以及为什么从每个连续的顶点开始绘制一个简单的三角形是行不通的(好吧,它会,但它会导致交替的缠绕顺序,这永远不会是一个好主意).所以第二篇文章(来自OpenGL编程指南)是正确的,第一篇文章是错误的,它的语义搞砸了或被你误解了(虽然考虑到该教程的质量,我猜后者,但也许Nicol博拉斯本人可以对此有所了解).
编辑:好的,看看第一篇文章的结尾:
注意它在顺时针和逆时针之间的交替方式.这意味着,无论你在前面考虑什么样的脸,以及你剔除什么样的脸,你总会失去大约一半的脸.
但是,OpenGL对此非常聪明.三角形条带不同地面对剔除.对于每个第二个三角形,绕线顺序与第一个三角形的顺序相反,绕线顺序被认为是向后以进行剔除.
因此,如果您已将正面设置为顺时针方向,并且具有面部剔除后退三角形,则只要第一个三角形的顺序正确,一切都将完全按预期工作.如果它具有顺时针绕组,则每个偶数三角形将被剔除,并且如果具有逆时针绕组,则每个奇数三角形将被剔除.
实际上,虽然绕组顺序在理论上是交替的,但是OpenGL解释了这一点,并为三角形条带"修复"它,导致绕组顺序实际上(对于所有面临的考虑,如剔除或gl_FrontFacing片段着色器变量)是相同的每个三角形.所以这两篇文章都是正确的,你只是直到最后才读到第一篇.虽然这篇文章可以更清楚地表明,它不是仅仅用于剔除目的,而是所有面临的目的,因此对你来说实际上是不可察觉的.
| 归档时间: |
|
| 查看次数: |
4705 次 |
| 最近记录: |