java - 如何使用适用于 Android 的 OpenGL 2.0 绘制 UV 球体并对其进行纹理处理

标签 java android opengl-es uv-mapping

我正在为 Android 创建一个虚拟现实应用程序,我想在 openGL 中生成一个球体以达到我的目的。第一步,我找到了这个线程( Draw Sphere - order of vertices ),其中第一个答案中有一个关于如何离线渲染球体的很好的教程。在同一个答案中,有一个我用于我的应用程序的球体( http://pastebin.com/4esQdVPP )的示例代码,然后我成功地将 2D 纹理映射到球体上。

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

这样做的问题是,当添加纹理时,它看起来在球体的两极处被破坏,而在球体的其余部分看起来不错(请看下面的图片)。 Picture of south pole North Pole Front view

我不知道我做错了什么,因为映射纹理的算法应该是相同的,所以我想问题可能出在生成的点的索引中。这是我用于映射纹理的算法: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 值:

enter image description here

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

enter image description here enter image description here enter image description here

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

enter image description here enter image description here

关于java - 如何使用适用于 Android 的 OpenGL 2.0 绘制 UV 球体并对其进行纹理处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777321/

相关文章:

java - DFS 未正确执行

java - 如何在执行junit时自动生成时序图

android - 如何使用Android 'flavor' strings.xml

iphone - 在 iPhone 中显示 OpenGL 动画的最佳过程

java - Linux - Java - VM 初始化期间发生错误

android - 即使我有互联网也无法 ping 站点

android - IntentFilter 的作用是什么?

javascript - three.js 中带有顶点着色器的属性会产生超出范围的顶点错误

opengl-es - 尝试在后台线程中加载/设置场景导致 "OpenGL error 0x0502 in -[CCSprite draw] 530"

java - 检测音频或视频转换是否处于 Activity 状态