OpenGL es 2.0 glDrawElements索引指针错误

时间:2012-11-22 08:43:25

标签: android ios opengl-es

我在使用每个面具有不同纹理的立方体纹理时遇到问题。我可以在所有面上绘制一个带有一个纹理的立方体,但是当我尝试使用多个纹理时它会失败。我试图这样做的方式是这样的:

//my indexing array located in a header file
#define NUM_IMAGE_OBJECT_INDEX 36
static const unsigned short cubeIndices[NUM_IMAGE_OBJECT_INDEX] =
{
    0, 1, 2,   2, 3, 0,      // front
    4, 5, 6,   6, 7, 4,      // right
    8, 9,10,  10,11, 8,      // top
    12,13,14,  14,15,12,     // left
    16,17,18,  18,19,16,     // bottom
    20,21,22,  22,23,20      // back
};

现在在我的渲染功能中,这当前适用于使用单个纹理

绘制立方体
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);

glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, 0);

这不起作用

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);

glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[0]);
通过查看其他一些例子,

应该等同于同一件事。最终我想这样做:

for(int i = 0; i < 6; i++){

    iconTextureID = textureID[i];                
    glBindTexture(GL_TEXTURE_2D, iconTextureID);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[i*6]); //index 0-5 use texture 1, 6-11 use texture 2, etc

}

有人知道这个索引有什么问题吗?香港专业教育学院基本上从一个Android项目(有效)复制粘贴此代码,目前正试图在ios上执行此操作。

1 个答案:

答案 0 :(得分:5)

在OpenGL ES 2.0中,索引数据可以来自缓冲区对象或指向客户端内存的指针。您的代码显然使用缓冲区对象。虽然您没有显示此缓冲区对象的创建,您上传客户端指针数组的位置,或者在使用它进行渲染之前调用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)的位置。必须在那里,否则你的代码就会崩溃。当缓冲区绑定到GL_ELEMENT_ARRAY_BUFFER时,OpenGL期望glDrawElements的“指针”是字节偏移到缓冲区对象中,而不是客户机内存指针。

这就是为什么复制和粘贴编码是一个坏主意。你复制的地方可能是使用客户端内存;你不是。

如果希望循环代码有效,则需要自己进行指针运算:

for(int i = 0; i < 6; i++)
{
    iconTextureID = textureID[i];                
    glBindTexture(GL_TEXTURE_2D, iconTextureID);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, reinterpret_cast<void*>(i * 6 * sizeof(GLushort)));
}