gpt4 book ai didi

android - OpenGL es 2.0 glDrawElements 索引指针错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:31:29 25 4
gpt4 key购买 nike

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

//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 上执行此操作。

最佳答案

在 OpenGL ES 2.0 中,索引数据可以来自缓冲区对象或指向客户端内存的指针。您的代码显然正在使用缓冲区对象。虽然您没有显示此缓冲区对象的创建,但您上传客户端指针数组的位置,或者在使用它进行渲染之前调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER) 的位置。它必须在那里,否则您的代码会崩溃。当缓冲区绑定(bind)到 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)));
}

关于android - OpenGL es 2.0 glDrawElements 索引指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13508728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com