【问题标题】:Could somebody explain how to use glDrawElements (iPhone)?有人可以解释如何使用 glDrawElements (iPhone) 吗?
【发布时间】:2011-03-08 17:46:15
【问题描述】:

抱歉重复了,但我已经谷歌搜索了几个小时没有任何结果。

我有一个从转换器导出的简单立方体的(优化的)数据:

// 8 Verticies
// 4 Texture Coordinates
// 6 Normals
// 12 Triangles

static GLshort cubeFace_indicies[12][9] = {
    // Box001
    {2,0,3 ,0,0,0 ,0,1,2 }, {1,3,0 ,0,0,0 ,3,2,1 }, {5,4,7 ,1,1,1 ,1,3,0 },
    {6,7,4 ,1,1,1 ,2,0,3 }, {1,0,5 ,2,2,2 ,1,3,0 }, {4,5,0 ,2,2,2 ,2,0,3 },
    {3,1,7 ,3,3,3 ,1,3,0 }, {5,7,1 ,3,3,3 ,2,0,3 }, {2,3,6 ,4,4,4 ,1,3,0 },
    {7,6,3 ,4,4,4 ,2,0,3 }, {0,2,4 ,5,5,5 ,1,3,0 }, {6,4,2 ,5,5,5 ,2,0,3 }
};
static GLfloat cubeVertices [8][3] = {
    {-100.0f,-100.0f,-100.0f},{100.0f,-100.0f,-100.0f},{-100.0f,100.0f,-100.0f},
    {100.0f,100.0f,-100.0f},{-100.0f,-100.0f,100.0f},{100.0f,-100.0f,100.0f},
    {-100.0f,100.0f,100.0f},{100.0f,100.0f,100.0f}
};
static GLfloat cubeNormals [6][3] = {
    {0.0f,0.0f,1.0f},{0.0f,0.0f,-1.0f},{0.0f,1.0f,0.0f},
    {-1.0f,0.0f,0.0f},{0.0f,-1.0f,0.0f},{1.0f,0.0f,0.0f}
};
static GLfloat cubeTextures [4][2] = {
    {1.0f,2.0f},{1.0f,1.0f},{0.0f,2.0f},
    {0.0f,1.0f}
};

我设置了纹理,我想在屏幕上看到一些东西。我最近的绘图代码如下:

glTexCoordPointer(2, GL_FLOAT, 0, cubeTextures);
glVertexPointer(3, GL_FLOAT, 0, cubeVertices);
glNormalPointer(GL_FLOAT, 0, cubeNormals);
glBindTexture(GL_TEXTURE_2D, textures[0]);

    glDrawElements(GL_TRIANGLES , 12, GL_SHORT, cubeFace_indicies);

【问题讨论】:

  • 当然不行。
  • 你打了哪些 glEnable() 调用?
  • glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glEnable(GL_DEPTH_TEST);
  • 是的,当然还有必要的 glEnableClientState 函数。

标签: iphone opengl-es textures vertices normals


【解决方案1】:

OpenGL ES(和常规 OpenGL)中的索引数据与您使用它的方式不同。不是为位置、法线和纹理坐标为每个顶点提供单独的索引,而是提供单个索引 i,并且 OpenGL ES 从每个启用的顶点获取元素 i数组。这意味着您需要为您在当前表示中创建的所有顶点-法线-texcoord 组合使用单独的索引,这可能需要稍微复制您的数据。

如果您的模型可以使用平面阴影绘制(即在绘制之前调用glShadeModel(GL_FLAT)),您也许可以避免指定更少的唯一点。在这种情况下,三角形中最后一个顶点的法线将用于整个三角形。当然,这需要对您的索引进行仔细排序。

【讨论】:

  • 谢谢你说清楚。但如果是真的,那么为什么 3D Exploring 会像这样导出数组呢?就是无法理解。无论如何,PolyTrans 以您描述的方式导出,当然效果很好。
【解决方案2】:

要使用 glDrawArrays,您必须使用 glEnableClientState(GL_VERTEX_ARRAY) 启用 GL_VERTEX_ARRAY 状态,然后使用 glVertexPointer(3, GL_FLOAT, 0, ) 创建每个顶点

【讨论】:

  • 我打错了标题。问题是关于 glDrawElements,现在我已经更新了。
猜你喜欢
  • 2011-12-26
  • 2012-05-29
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多