我在objc中为OpenGL ES 2.0编写自己的.obj解析器,以便更好地理解这个OpenGLES的工作原理。加载顶点并在其上显示具有顶点颜色的模型就像一个魅力。只是一个小小的注释:我正在使用索引缓冲区。
真正的问题是纹理atm的映射。正如你在下面看到的更多一点,我的纹理没有按照应有的方式进行映射。
以下是我认为.obj格式的工作原理,如果我错了,请纠正我:“f”-lines描述一个面,斜杠前面的数字定义顶点的索引和斜杠定义后的数字纹理坐标。
考虑以下.obj文件(由Cinema 4D导出):
v -75 75 -50
v 75 75 -50
v -75 -75 -50
v 75 -75 -50
vt 0 0
vt 0 1
vt 1 1
vt 1 0
f 4/3 3/2 1/1
f 2/4 4/3 1/1
以下纹理:
现在,当我将顶点放置在OpenGL ES 3D空间中并尝试将纹理坐标映射到每个单独的顶点时,映射会出错。我可以通过移动一些纹理坐标值来解决这个问题,但我意识到这不是这样做的方法。我还尝试编辑我的一些.obj导出器设置来翻转轴和/或uv映射,但不是它们导致正确的映射。我的理论中有关于.obj文件格式的内容吗?我可能已经说过一件事:我昨天读到.obj格式的坐标系将topleft定义为纹理的锚点。所以我已经解决了这个问题。
以下是目前情况的小摘要: 更新:纹理的坐标系是实际的.obj纹理坐标系,而不是OpenGL的坐标系。我翻译我的解析算法中的坐标来反击这个。
答案 0 :(得分:4)
据我所知,您报告的坐标系统不正确。
实际上它是这样的:
我知道这可能不是对你问题的实际回应,但我希望它对此有所了解。
答案 1 :(得分:3)
我将回答我自己的问题:问题似乎是我使用索引缓冲区来加速性能,但我的纹理坐标仍然映射到原始顶点。
答案 2 :(得分:3)
我发现了解析.obj文件的类似问题。 在我的情况下,似乎我的.obj文件使用倒V(第二纹理坐标)轴。 我用这行代码解决了这个问题。 v = 1.0f - v;
答案 3 :(得分:1)
Maurizio对于opengl texturemapping坐标的表示是正确的。
通过查看你的照片,我会说你应该更好地看看你的objC代码。 假设.obj被C4D正确导出,看起来你的纹理索引已经混淆了。
合理的证明:在您张贴的图片中切换左下顶点和右下顶点(“结果Opengl”),你的纹理就会出现。
编辑:实际上,错误可能在你的纹理加载代码中,但这并不能解释你得到的结果。即使故障在纹理加载中,纹理也会简单地显示为倒置(因为左下角的opengl坐标系)。建议:在代码中切换vt0和vt3 ......