1

我正在使用 Cheetah3D 导出​​ COLLADA 文件 ( .dae ),然后使用 Erik Buck 的 COLLADAViewer2 ( https://github.com/erikbuck/COLLADAViewer2/tree/master/COLLADAViewer2 ) 程序导出模型列表格式,如他的书中所述。

我的 COLLADA 文件是一个简单的球体,我正在尝试在其上渲染地球纹理。

在 COLLADAViewer 程序中,我导出的 .dae 文件看起来不错,这是一个屏幕截图:

在此处输入图像描述

我用于在球体上渲染纹理的代码部分在这里:

// Setup texture
CGImageRef imageRef =
[[UIImage imageNamed:@"Earth.jpg"] CGImage];

GLKTextureInfo *textureInfoEarth = [GLKTextureLoader
                               textureWithCGImage:imageRef
                               options:[NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:YES],
                                        GLKTextureLoaderOriginBottomLeft, nil]
                               error:NULL];

self.baseEffect.texture2d0.name = textureInfoEarth.name;
self.baseEffect.texture2d0.target = textureInfoEarth.target;

// Enable fragment blending with Frame Buffer contents
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

不幸的是,在 XCode 中,当我构建和运行我的球体时,在模拟器上看起来像这样:

在此处输入图像描述

我不知道如何解释球体上的奇怪图案,就像纹理在那里但被重复一样。谁能帮我解决这个问题?谢谢 -

我将我正在试验的 xcode 项目上传到 Github。它使用了 Buck 先生的 OpenGL 书中的大量示例代码。

这是链接: https ://github.com/phishstang65/renderer

4

1 回答 1

3

在我看来,模型中每个三角形的纹理坐标都是相同的。

查看您的代码,我认为您的顶点缓冲区的格式为每个顶点 40 个字节,每个值是GLFloat两个字节,3 表示位置,3 表示法线,2 表示纹理坐标,2 表示第二组纹理坐标。

我运行该应用程序,在它填充UtilityMesh对象中的数据后使用断点。在调试器中查看它的数据转储,有一个明确的模式,每 40 个字节重复一次。位置和法线的前 24 个字节按预期变化。最后八个字节始终为0,我认为对应于未使用的第二组纹理坐标。问题是对应于主要纹理坐标的八个字节循环通过三个值。

00000000 00000000 
0000003d 0000803d 
00000000 0000803d

所以我认为你的程序很好,只是得到了坏数据。检查您的转换过程。

于 2013-01-08T21:03:53.950 回答