iPhone OpenGL ES 2.0 奇怪的图案在 COLLADA 文件中的球体上渲染纹理

Posted

技术标签:

【中文标题】iPhone OpenGL ES 2.0 奇怪的图案在 COLLADA 文件中的球体上渲染纹理【英文标题】:iPhone OpenGL ES 2.0 Strange Pattern Rendering Texture on Sphere from COLLADA File 【发布时间】:2012-12-18 10:54:01 【问题描述】:

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

我的 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

【问题讨论】:

能否贴出加载球体和渲染球体的代码? 您好 - 我没有发布大量代码,而是将相关项目上传到 Github,而是将链接放在我的帖子中。非常感谢您的帮助 - 谢谢! 【参考方案1】:

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

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

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

00000000 00000000 
0000003d 0000803d 
00000000 0000803d

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

【讨论】:

以上是关于iPhone OpenGL ES 2.0 奇怪的图案在 COLLADA 文件中的球体上渲染纹理的主要内容,如果未能解决你的问题,请参考以下文章

iPad 或 iPhone 是不是支持 OpenGL ES 2.0?

iPhone 上的 OpenGL ES 2.0:无法超过小索引/顶点数

iphone opengl es 2.0,如何使用objective-c类来存储原始数据?

是否可以在顶点着色器内持续更改 iPhone OpenGL ES 2.0 上的 VBO 值?

如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?

OPENGL ES 2.0 知识串讲 ——OPENGL ES 详解III(纹理)