OpenGL三角形条带中的缠绕方向是否从三角形到三角形交替?

时间:2013-08-01 16:43:29

标签: 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);

从我读到的here开始,OpenGL中的默认正面是逆时针方向,这意味着我的条带中的第一个三角形应该有逆时针方向排列的顶点。另外,当绘制三角形条带时,绕组在逆时针和从三角形到三角形的顺时针方向之间切换方向,因此我的顶点以这种方式排序。所以从我的代码中,第一个三角形是ABC,第二个是BCD,第三个CDE和第四个DEF。但是,this文章(在OpenGL编程指南的引用中)说它会将它们绘制为ABC,CBD,CDE,EDF(假设v0 - A,v1 - B等),这意味着它们都会逆时针方向相同。

如果我从OpenGL规范中正确理解A / B符号,那么三角形都将朝同一方向旋转,但我在不同的地方看到了变化的绕组。我想这只是一个语义问题,因为结果形状是相同的,但实际的绕组顺序是什么?

2 个答案:

答案 0 :(得分:7)

  

所以从我的代码来看,第一个三角形是ABC,第二个是BCD,第三个CDE和第四个DEF。然而,这篇文章(在OpenGL编程指南的引用中)表示它会将它们绘制为ABC,CBD,CDE,EDF(假设v0-A,v1-B等),这意味着它们都逆时针旋转方向。

他们都说的是真的。从某个角度来看;)

您引用的教程是从顶点提供到光栅化器的顺序的角度来讨论它。这正如所述。光栅化器可以看到单个ABCDEF ...的流。因此,从这个角度来看,光栅化器必须在每个其他三角形上切换其内部缠绕顺序,以匹配用户的意图。

你引用的那本书是从如何看待这些三角形的顺序的角度来谈论它的。当你按顺序提供它们时,你希望绕组像ABC,CBD,CDE等一样工作。为了达到这个目的,你可以用ABCDEF ...顺序提供它们。

答案 1 :(得分:5)

请放心,由三角形条带产生的三角形都以相同的顺序缠绕(否则它将完全混乱,你不能使用简单的东西,如背面剔除或双面渲染),这是三角形条带魔力的一部分,为什么只是从每个连续的顶点开始绘制一个简单的三角形是行不通的(好吧,它会,但它会导致交替的绕组顺序,这永远不会是一个好主意)。所以第二篇文章(来自OpenGL编程指南)是正确的,第一篇文章是错误的,它的语义搞砸了或被你误解了(虽然考虑到该教程的质量,我猜后者,但可能< em> Nicol Bolas 他自己可以对此有所了解。)

编辑:好的,看看第一篇文章的结尾:

  

注意它在顺时针和逆时针之间的交替方式。这个   意味着,无论你在前面考虑什么样的面孔,以及面部是什么   你剔除,你总会失去大约一半的脸。

     

然而,OpenGL对此非常聪明。三角条做   面对剔除不同。对于每一个第二个三角形,那个人都是   绕组顺序与第一个三角形的顺序相反,即绕组   为了剔除目的,订单被认为是倒退。

     

因此,如果您将正面设置为顺时针方向,并且有正面   剔除剔除后向三角形,一切都将完全一样   只要第一个三角形的顺序正确,你就会期望。   如果它具有顺时针方向,则每个偶数编号的三角形都将被剔除   绕组,如果它有一个,则每个奇数三角形都会被剔除   逆时针缠绕。

它实际上说虽然绕线顺序在理论上是交替的,但是OpenGL解释了这一点,并为三角形条带“修复”它,实际上导致绕线顺序(对于所有面临的考虑,如剔除或gl_FrontFacing片段着色器变量)对于每个三角形都是相同的。所以这两篇文章都是正确的,你只是直到最后才读到第一篇。虽然这篇文章可以更清楚地说明它不仅仅是用于剔除目的,而是所有面临的目的,因而对你来说几乎是不可察觉的。