如何绘制具有多个纹理的网格

时间:2013-09-18 10:07:45

标签: objective-c cocoa opengl-es glkit opengl-es-1.1

我正在听这个帖子的回答:Binding Multiple Textures to One Mesh in OpenGL ES 1.1

我的实施似乎没有起作用,我不知道为什么。

以下是我的代码的事实:

  • textureArray是由GLKTextureInfo对象填充的NSMutableArray
  • groupMesh是一个结构数组,包含:
    • 指向索引数组中我们想要获取索引的位置的指针。
    • 索引数据的大小

-

  • 我的顶点有一个元素数组缓冲区,我的索引有一个

我决定制作一个for循环。在每次迭代中,我从GLKTextureInfo数组绑定一个不同的纹理,并将指针更改为我想要用我刚刚绑定的纹理绘制的索引数据的内存区域。

-

for (int i = 0; i<mesh->numMeshes-1; i++)
{
    glBindTexture(GL_TEXTURE_2D,
                  [(GLKTextureInfo *)[textureArray objectAtIndex:i] name]);


    glDrawElements(GL_TRIANGLES,
                        mesh->groupMesh[i].indexDataSize*4,
                        GL_UNSIGNED_INT,
                        mesh->groupMesh[i].indexPointer);

}

数组中的第一个纹理是树皮纹理,第二个纹理是树叶。

然而,第一次迭代后纹理没有绑定。这给出了这样的结果:

http://img69.imageshack.us/img69/5138/tbko.png

我强制循环测试我的理论是否正确并将objectAtIndex:i更改为objectAtIndex:1,并且叶子纹理全部出现:

http://img266.imageshack.us/img266/5598/c05n.png

所以它似乎只是glBindTexture无效,是因为opengl已经处于绘制状态了吗?有办法解决这个问题吗?

注意:(昨天我问了一个类似的问题,但现在我做了一些研究,但我仍然不知道我做错了什么。)

1 个答案:

答案 0 :(得分:0)

我想的越多,你的索引数据实际上可能是这里的责任。

首先,GL_UNSIGNED_INT是顶点数组元素索引的可怕选择。您很少需要42亿个顶点,GL_UNSIGNED_SHORT(最多65536个顶点)是首选索引类型 - 尤其是在嵌入式设备上。对于少于256个顶点的网格,GL_UNSIGNED_BYTE可能很有吸引力,但大多数硬件本身不支持8位索引,所以你只需要在驱动程序上投入更多的工作。

现在可能会导致此问题:

您使用mesh>groupMesh[i].indexDataSize*4表示要绘制的顶点数。这将超出您的索引数组和indexDataSize*3 - 许多顶点将无效。听起来很奇怪,因为3/4的绘制顶点会调用未定义的行为,这可能是造成纹理问题的原因。