索引顺序影响 OPENGL 中的立方体结构

Posted

技术标签:

【中文标题】索引顺序影响 OPENGL 中的立方体结构【英文标题】:Order of Indices affect the cube structure in OPENGL 【发布时间】:2014-07-06 03:25:18 【问题描述】:

好的,我知道如果顺序错误,它肯定会影响结构。 但是我有两组索引,我认为它们对于渲染立方体是正确的。 当我使用其中一个时,立方体被正确渲染,但对于另一个它不是(检查图像)。

这是我正在使用的: 以下渲染正确

GLubyte cubeIndices[24]=0,3,2,1,2,3,7,6,0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4;
glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,&cubeIndices);

这个渲染不正确

GLubyte cubeIndices[24]=1,2,3,4,5,8,7,6,1,5,6,2,2,6,7,3,3,7,8,4 ,5,1,4,8;
glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,&cubeIndices);

我使用两个顶点的相同集合。谁能告诉我为什么不工作???

【问题讨论】:

顶点序列0,3,2,11,2,3,4 可以相同吗?它们指的是不同的顶点。此外,您在“错误”缓冲区中没有 0 索引。无论如何,您可以自己做一个简单的研究,为顶点添加不同的颜色。这样你就可以看到事情的变化。或者使用任何图形调试工具。 是的,这些根本不一样。他们甚至没有使用相同的顶点。第一个使用索引范围为 0..7 的顶点,第二个使用范围为 1..8 的顶点。 @ASHUTOSH 我的意思是如果0,3,2,1属于一张脸,那么41,2,3属于不同的脸。 @RetoKoradi 有帮助。第一组指标是我自己计算的指标。第二组是用blender生成的。不知道为什么blender用的是1-8而不是0-7。 @ASHUTOSH 网格格式的索引通常从 1 开始。这只是设计使然,我们必须忍受它,每次减去一个;) 【参考方案1】:

虽然这两个索引序列乍一看完全不同,但它们确实密切相关。主要区别在于第二个包含基于 1 的索引,而第一个包含基于 0 的索引。 OpenGL 需要基于 0 的索引。

还有一个不同之处。按四边形分组,第一个序列是这样的:

0,3,2,1
2,3,7,6
0,4,7,3
1,2,6,5
4,5,6,7
0,1,5,4

第二个,每个值减1后,是这样的:

0,1,2,3
4,7,6,5
0,4,5,1
1,5,6,2
2,6,7,3
4,0,3,7

四边形的顺序明显不同。现在重新排序第二个列表以使四边形的顺序相同,并将它们并排书写以进行比较:

0,3,2,1    0,1,2,3
2,3,7,6    2,6,7,3
0,4,7,3    4,0,3,7 --> 0,3,7,4
1,2,6,5    1,5,6,2
4,5,6,7    4,7,6,5
0,1,5,4    0,4,5,1

对于第三个四边形,我还循环移动了索引以便于比较。

不同之处在于,在比较两个索引序列时,所有四边形的顺序完全相反。这在使用 OpenGL 渲染它们时可能很重要,因为它决定了四边形的缠绕顺序。特别是如果您启用背面剔除,您需要确保从外部看立方体时多边形的方向是逆时针的。

【讨论】:

以上是关于索引顺序影响 OPENGL 中的立方体结构的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL立方体贴图面顺序和采样问题

[计算机图形学 with OpenGL] Chapter10 OpenGL三维观察程序示例

OpenGL中的3D立方体网格

OpenGL First Cube渲染不起作用

3D Computer Grapihcs Using OpenGL - 20 结合Buffer

纹理不适用于我在 C++ 和 OpenGL 中的立方体