2014-04-28 42 views
3

我见过很多方法来声明空间中立方体的顶点。有些代码申报36个顶点,其他一些只有八,这样的:最佳做法 - 声明操作2.0立方体顶点

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 
           }; 
+0

某些解决方案可能使用多于8个顶点的原因是每个立方体面都需要唯一的颜色/法线。如果没有平面着色+挑动顶点,共享顶点将导致每个面的颜色/法线被平均。 –

回答

1

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

您需要小心的唯一一件事是:当您实际使用顶点构建立方体订单事项

默认情况下,opengl需要逆时针提供顶点。我相信你可以重写这种行为,但我花了很多时间试图找出我认为是编码错误的原因,这些错误竟然是顶点排序错误。只要你记得始终以逆时针方式构建顶点(从立方体的外部看),渲染应该可以正常工作。

+0

'我相信你可以重写那个行为' - [glCullFace](http://www.khronos.org/opengles/sdk/docs/man/xhtml/glCullFace.xml) – ssell

+0

更重要的是,你可以重新定义光栅化器使用'glFrontFace(...)'作为前端的面部。前脸不仅仅是剔除,而是简单地剔除不同侧面,这样经常出现这种情况,因此正确定义前端更有意义。而且,要理解这个绕组计算是在后投影空间中完成的。例如,反转投影矩阵中的Y轴将反转多边形绕组。 –

+0

那么,按照上面的方法,我应该使用TRIANGLES还是TRIANGLES_STRIP? – Muteking