2012-11-22 64 views
2

我在纹理每个面具有不同纹理的立方体时遇到了问题。我可以在所有面上绘制一个纹理的立方体,但是当我尝试使用多个纹理时,它会失败。的方式即时通讯试图做的是像这样:OpenGL es 2.0 glDrawElements索引指针错误

//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 

} 

有没有人知道什么可能是错误的这种索引? ive基本上复制粘贴这个代码从一个Android项目(工程),目前试图做到这一点在iOS上。

+1

“*香港专业教育学院基本上是复制粘贴从Android项目(工作)的代码,目前正在努力做到这一点关于ios。*“请停止复制粘贴代码。试着*了解*代码在做什么,*为什么*该代码在该项目中是合适的。 –

回答

4

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

感谢你的工作就像一个魅力,但你能帮我理解为什么我不能使用客户端内存指针?这里是我如何设置我的缓冲区等http://pastebin.com/8xgQrzDt,我需要改变什么才能让它工作?或者只是指向我看看的东西。还有,哪种方式更好? –

+0

@尼科尔布拉斯,你为什么在这里使用reinterpret_cast? – Kimi

+1

@Kimi:因为它是“不安全的转换”的通用C++标志。究竟是什么:没有C++认可的将整数转换为“void *”的方法,其数值是该整数。至少用这种方法你可以在代码中找到它,不像'(const GLvoid *)'方式。 –