最佳实践-声明opengles 2.0立方体顶点

3

我看到过很多在空间中声明立方体顶点的方法。一些代码声明了36个顶点,而其他一些只声明了8个,就像这样:

private float vertices[] = {
                                -1.0f, -1.0f, -1.0f, //p1 lower left far plane (0)
                                1.0f, -1.0f, -1.0f,  //p2 lower right far plane (1)
                                1.0f,  1.0f, -1.0f,  //p3 top right far plane (2)
                                -1.0f, 1.0f, -1.0f,  //p4 top left far plane (3)
                                -1.0f, -1.0f,  1.0f, //p5 lower left near plane (4)
                                1.0f, -1.0f,  1.0f,  //p6 lower right near plane (5)
                                1.0f,  1.0f,  1.0f,  //p7 top right near plane (6)
                                -1.0f,  1.0f,  1.0f  //p8 top left near plane (7)
                                };

看起来你只画了两个面然后填补了空洞。 这似乎更好,因为可以节省宝贵的字节。 这是正确的吗?我应该在索引数组中指定什么顺序?

---编辑 好的,我明白了。这应该是声明顶点的顺序,对吗?但是我的立方体某些面上的三角形有问题。

private short order[] = {
                              0, 4, 5, 0, 5, 1, //bottom face
                              1, 5, 6, 1, 6, 2, //right face
                              2, 6, 7, 2, 7, 3, // top face
                              3, 7, 4, 3, 4, 0, // left face
                              4, 7, 6, 4, 6, 5, // front face
                              3, 0, 1, 3, 1, 2 // back face
                              };

一些解决方案可能会使用超过8个顶点的原因是如果每个立方体面需要唯一的颜色/法线。如果没有平面着色+触发顶点,共享顶点将导致每个面的颜色/法线被平均。 - Andon M. Coleman
1个回答

1

没错。一旦你定义了正面和背面(近和远)的顶点,就已经提供了构建立方体所需的所有信息。其他任何东西都是多余的并浪费内存。

唯一需要注意的是:当你实际使用这些顶点来构建立方体时,顺序很重要

默认情况下,OpenGL期望以逆时针方式提供顶点。我相信你可以覆盖这种行为,但我花了很多时间试图弄清楚我认为是编码错误的错误,结果却是顶点顺序错误。只要记得始终以逆时针方式(从立方体外部看)构建顶点,渲染应该能正常工作。


我相信你可以覆盖那种行为。 - glCullFace - ssell
更重要的是,您可以使用glFrontFace(...)重新定义光栅化器认为的正面。正面影响的不仅仅是剔除,因此通常情况下,与其仅仅剔除不同的一侧,更有意义的是正确地定义正面。但是,请注意,这个绕组计算是在投影后的空间中完成的。例如,在投影矩阵中反转Y轴将反转多边形绕组。 - Andon M. Coleman
那么,按照上面的方法,我应该使用TRIANGLES还是TRIANGLE_STRIP? - Muteking
很高兴看到你对OpenGL充满热情。我假设你是OpenGL新手。如果我回到你的位置,我会使用三角形,渲染一个面并查看它,然后迭代地渲染另一个面,以便我可以看到它的工作原理。另一件可能对你有帮助的事情是NeHe教程,它们被认为是入门指南的权威,附带代码/项目文件。 - Semicolons and Duct Tape
是的,我是新手,克莱顿。我终于成功地渲染了立方体,但只能使用triangle_strip。虽然我看过一些只用TRIANGLES的例子,但我无法解释为什么。 - Muteking
没有技术上的原因阻止你用三角形渲染一个立方体。我建议你在这里看一下NeHe教程1-5,它们简短而详细地介绍了你需要知道的所有内容。 - Semicolons and Duct Tape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接