Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL es 2.0 GLD元素索引指针错误_Android_Ios_Opengl Es - Fatal编程技术网

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*)
方式不同。