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 值?