gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:22:30 25 4
gpt4 key购买 nike

我正在关注此线程的答案:Binding Multiple Textures to One Mesh in OpenGL ES 1.1

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

以下是我的代码的事实:

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

-

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

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

-

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);

}

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

但是,第一次迭代后纹理不再绑定(bind)。这给出了这种结果:

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

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

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

所以这似乎是 glBindTexture 不起作用,是因为 opengl 已经处于绘制状态吗?有办法解决这个问题吗?

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

最佳答案

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

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

现在看看实际上可能导致此问题的原因:

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

关于objective-c - 如何绘制具有多个纹理的网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869372/

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