3

我正在为 OpenGL ES 2.0 在 objc 中编写自己的 .obj 解析器,以便更好地了解 OpenGLES 的工作原理。加载顶点并显示带有顶点颜色的模型就像一个魅力。只是一个小提示:我正在使用索引缓冲区。

真正的问题是纹理 atm 的映射。正如您将在下面看到的那样,我的纹理没有按照应有的方式映射。

这是我认为 .obj 格式的工作原理,如果我错了,请纠正我:“f”行描述了一个面,其中斜线之前的数字定义了顶点的索引,斜线之后的数字定义了纹理坐标.

考虑以下 .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

以及以下纹理:

512x512 纹理

现在,当我在 OpenGL ES 3D 空间中定位顶点并尝试将纹理坐标映射到每个单独的顶点时,映射会出错。我可以通过移动一些纹理坐标值来解决这个问题,但我意识到这不是解决问题的方法。我还尝试编辑我的一些 .obj 导出器设置以翻转轴和/或 uv 映射,但它们都不会导致正确的映射。关于 .obj 文件格式,我的理论中有什么遗漏吗?我可能已经说过一件事:我昨天读到 .obj 格式的坐标系统将左上角定义为纹理的锚点。所以我已经在解析中修复了这个问题。

以下是对当前情况的一个小总结: 更新:纹理的坐标系是实际的 .obj 纹理坐标系,而不是 OpenGL 的坐标系。我在我的解析算法中翻译坐标来解决这个问题。

概括

4

4 回答 4

5

据我所知,您报告的坐标系不是正确的。

实际上是这样的:

坐标系

我知道这可能不是对您问题的实际回答,但我希望它能够对此有所了解。

于 2012-01-13T14:10:04.570 回答
3

我在解析 .obj 文件时发现了类似的问题。就我而言,我的 .obj 文件似乎使用倒置的 V(第二纹理坐标)轴。我用这行代码解决了这个问题。v = 1.0f - v;

于 2015-10-24T23:22:23.220 回答
2

我要回答我自己的问题:问题似乎是我使用索引缓冲区来提高性能,但我的纹理坐标仍然映射到原始顶点。

于 2012-07-26T09:39:24.147 回答
1

Maurizio 对 opengl 纹理映射坐标的表示是正确的。

通过查看您的图片,我会说您应该更好地查看您的 objC 代码。假设 .obj 由 C4D 正确导出,看起来您的纹理索引混淆了。

似是而非的证据:在您发布的图片(“Result Opengl”)中将左下角的顶点与右下角的顶点切换,您的纹理就会正确显示。

编辑:实际上,错误可能出在您的纹理加载代码中,但这并不能解释您得到的结果。即使错误出现在纹理加载中,纹理也会简单地颠倒显示(因为左下角的 opengl 坐标系)。建议:在您的代码中切换 vt0 和 vt3 ......

于 2012-01-27T21:05:26.003 回答