首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL es 2.0 glDrawElements索引指针错误

OpenGL es 2.0 glDrawElements索引指针错误
EN

Stack Overflow用户
提问于 2012-11-22 16:43:25
回答 1查看 2K关注 0票数 2

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

代码语言:javascript
复制
//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
};

现在,在我的渲染函数中,这项功能目前适用于使用单一纹理绘制立方体

代码语言:javascript
复制
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);

glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, 0);

这不起作用

代码语言:javascript
复制
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);

glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[0]);

从其他一些例子来看,这应该等同于相同的事情。最终,我想这样做:

代码语言:javascript
复制
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上做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 00:18:49

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

这就是为什么复制粘贴编码不是一个好主意。你复制的地方可能是在使用客户端内存,而你没有。

如果你想让你的循环代码工作,你需要自己做指针运算:

代码语言:javascript
复制
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)));
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13508728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档