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 已经处于绘制状态?有没有解决的办法?

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

4

1 回答 1

0

我越想,你的索引数据实际上可能是罪魁祸首。

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

现在讨论可能导致此问题的实际原因:

您正在使用mesh>groupMesh[i].indexDataSize*4要绘制的顶点数。这将超出您的索引数组并且indexDataSize*3-many vertices 将无效。听起来很奇怪,因为 3/4 的绘制顶点调用未定义的行为,这可能是纹理问题的原因。

于 2013-09-18T17:59:09.157 回答