Android OpenGL es 2.0 GLD元素索引指针错误
我有麻烦与纹理立方体与不同的纹理每面。我可以在所有面上绘制一个纹理的立方体,但是当我尝试使用多个纹理时,它失败了。我尝试这样做的方式是:Android OpenGL es 2.0 GLD元素索引指针错误,android,ios,opengl-es,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, // fr
//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
}
for(int i=0;i<6;i++){
iconTextureID=textureID[i];
glBindTexture(GL_TEXTURE_2D,iContextured);
GLD元素(GL_三角形,6,GL_无符号_短,(常量GLvoid*)和立方索引[i*6]);//索引0-5使用纹理1,6-11使用纹理2,等等
}
有人知道这个索引有什么问题吗?我基本上是从一个android项目复制粘贴了这段代码(它可以工作),目前正试图在ios上执行此操作。在OpenGL ES 2.0中,索引数据可以来自缓冲区对象或指向客户端内存的指针。您的代码显然使用了缓冲区对象。虽然没有显示此缓冲区对象的创建,但在使用它进行渲染之前,可以在哪里上载客户端指针数组,或者在哪里调用
glBindBuffer(GL\u元素\u数组\u缓冲区)
。它一定在那里,否则你的代码就会崩溃。当一个缓冲区绑定到GL\u ELEMENT\u ARRAY\u buffer
时,OpenGL希望提供给GL抽屉元素的“指针”是缓冲区对象的字节偏移量,而不是客户端内存指针
这就是为什么复制粘贴编码是个坏主意。您复制的位置可能使用了客户端内存;你不是
如果希望循环代码正常工作,则需要自己执行指针算术:
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)));
}
for(int i=0;i<6;i++)
{
iconTextureID=textureID[i];
glBindTexture(GL_TEXTURE_2D,iContextured);
GLD元素(GL_三角形,6,GL_无符号短,重新解释投射(i*6*sizeof(GLushort));
}
“我基本上是从一个android项目复制粘贴了这段代码(该项目有效),目前正试图在ios上执行此操作。”请停止复制和粘贴代码。试着理解代码在做什么,以及为什么该代码适用于该项目。谢谢,这非常有效,但是你能帮我理解为什么我不能使用客户端内存指针吗?这里是我如何设置我的缓冲区等,我需要改变什么才能让它工作?或者只是指给我看一些东西。还有,哪种方式更好?@尼科尔-博拉斯,为什么你要在这里使用RealType?@基米:因为它是通用的C++符号,用于“不安全的演员”。这就是事实:没有C++认可的方法将整数转换为void*
谁的数值就是那个整数。至少通过这种方式,您可以在代码中找到它,这与(const GLvoid*)
方式不同。