如何使用 OpenGL 2.0 为 Android 绘制和纹理 UV 球体

How to draw and texture a UV Sphere with OpenGL 2.0 for Android

我正在为 android 创建一个虚拟现实应用程序,我想在 openGL 中生成一个 Sphere 用于我的目的。在第一步中,我找到了我用于我的应用程序的线程 (Draw Sphere - order of vertices) where in the first answer there is a good tutorial of how to offline render the sphere. In that same answer, there is a sample code of a sphere(http://pastebin.com/4esQdVPP),然后我成功地将 2D 纹理映射到球体上。

但是,那个示例球体的分辨率很差,我想生成一个更好的,所以我继续按照一些搅拌机教程来生成球体,然后导出 .obj 文件并简单地获取点坐标和索引并将它们解析为 java 代码。

这样做的问题是,当添加纹理时,它在球体的两极看起来很破损,而在球体的其余部分看起来很好(请看下面的图片)。

我不知道我做错了什么,因为映射纹理的算法应该是相同的,所以我猜问题可能出在生成的点的索引中。这是我用于映射纹理的算法:https://en.wikipedia.org/wiki/UV_mapping#Finding_UV_on_a_sphere

这是使用 blender 自动生成的 .obj 文件:http://pastebin.com/uP3ndM2d

从那里,我们提取索引和坐标: 这是积分指数:http://pastebin.com/rt1QjcaX

这是点坐标:http://pastebin.com/h1hGwNfx

你能给我一些建议吗?我做错了什么吗?

首先,确定极点处(甚至附近)的纹理坐标需要小心处理。使用针对极点 s 坐标建议的 UV 算法不会为您提供您想要的镶嵌细分(例如,s = 0.5 + arctan2(1,0)/(2*pi) 将用于所有北极点)。在下图中,顶行的 M+1 个顶点都代表北极的同一个顶点——每个顶点都具有相同的 t-值,但必须有不同的 s-纹理坐标值:

其次,使用这种类型的曲面细分会在极点附近产生混叠问题,因为相邻片段之间的小距离会在 s 值之间产生很大的差异。您应该使用 mipmap 过滤器尽可能地减轻锯齿。下图显示了地球的墨卡托投影和球体上纹理的垂直红色条纹(条纹是一个很好的测试案例):

更好的球面镶嵌是细分一个二十面体,这将产生几乎等边的三角形。这是避免这些锯齿问题的法线贴图球体示例:

好的,现在问题解决了。纹理无法正常工作,因为生成的点索引从 1 而不是 0 开始。通过将所有索引减去 1,问题就解决了...:)