我正在为 Android 创建一个虚拟现实应用程序,我想在 openGL 中生成一个球体以达到我的目的。第一步,我找到了这个线程( Draw Sphere - order of vertices ),其中第一个答案中有一个关于如何离线渲染球体的很好的教程。在同一个答案中,有一个我用于我的应用程序的球体( http://pastebin.com/4esQdVPP )的示例代码,然后我成功地将 2D 纹理映射到球体上。
但是,该示例球体的分辨率很差,我想生成一个更好的分辨率,因此我继续遵循一些 blender 教程来生成球体,然后导出 .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 值:
其次,使用这种类型的镶嵌会在极点附近产生混叠问题,因为相邻 fragment 之间的距离较小,s 值之间会产生较大的差异。您应该使用 mipmap 过滤器尽可能地减轻锯齿现象。下图显示了地球的墨卡托投影和球体上的垂直红色条纹纹理(条纹是一个很好的测试用例):
更好的球体镶嵌是分割二十面体,这将产生几乎等边的三角形。以下是避免这些锯齿问题的法线贴图球体示例:
关于java - 如何使用适用于 Android 的 OpenGL 2.0 绘制 UV 球体并对其进行纹理处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777321/