我正在听这个帖子的回答:Binding Multiple Textures to One Mesh in OpenGL ES 1.1
我的实施似乎没有起作用,我不知道为什么。
以下是我的代码的事实:
-
我决定制作一个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已经处于绘制状态了吗?有办法解决这个问题吗?
注意:(昨天我问了一个类似的问题,但现在我做了一些研究,但我仍然不知道我做错了什么。)
答案 0 :(得分:0)
我想的越多,你的索引数据实际上可能是这里的责任。
首先,GL_UNSIGNED_INT
是顶点数组元素索引的可怕选择。您很少需要42亿个顶点,GL_UNSIGNED_SHORT
(最多65536个顶点)是首选索引类型 - 尤其是在嵌入式设备上。对于少于256个顶点的网格,GL_UNSIGNED_BYTE
可能很有吸引力,但大多数硬件本身不支持8位索引,所以你只需要在驱动程序上投入更多的工作。
您使用mesh>groupMesh[i].indexDataSize*4
表示要绘制的顶点数。这将超出您的索引数组和indexDataSize*3
- 许多顶点将无效。听起来很奇怪,因为3/4的绘制顶点会调用未定义的行为,这可能是造成纹理问题的原因。