java - 根据分辨率更改 3D 模型纹理

标签 java android 3d opengl-es libgdx

据我所知,您可以使用 Gdx.graphics.getDensity() 获取屏幕尺寸和密度,因此您可以加载正确的纹理,例如 1x、1.5x 等。

但是 3D 模型附带的纹理怎么样,例如纹理的最大尺寸仅为 1280x800px,而我的 Android 的 dpi 为 3x。

我不想将其缩放太多,因为它会导致图像变得太模糊/褪色/不清晰,请问有人知道解决方案吗?

编辑: 让我详细解释一下

  1. 我附有一个 ModelInstance、纹理图集 (2048x2048px)。
  2. 当游戏在 4k 屏幕下打开时,我将模型的比例扩大了近三倍,导致纹理变得模糊,这是有道理的,因为从 240dpi 到 640dpi 差异非常大。

所以在我看来,解决方案是制作一些 240dpi、320dpi、480dpi 等的纹理图集。问题是我不知道如何替换从一开始就已经与模型集成的纹理图集?因此,当放大时,纹理图集会自动替换为更高的纹理图集。谢谢

最佳答案

通常在 3D 图形中,相机或模型是移动的。纹理没有固定的最佳分辨率,因为相机可能非常近、非常远或以掠射角度查看纹理表面。

图形API提供的解决方案是纹理过滤的设置。在放大情况下(纹素占据的屏幕像素以上),您可以对软边缘进行线性过滤,或对硬边缘进行点过滤。缩小更为复杂,您可以使用线性或点过滤,但也可以使用 mipmap,它们是预先计算的图像连续半尺寸版本的链,通常一直降至 1x1。您可以设置纹理过滤来选择最近的 mipmap、在 mipmap 之间进行混合,或使用各向异性过滤来提高掠射角度的清晰度。通常用于放大的线性过滤,以及用于缩小的各向异性过滤的完整 mipmap 链可产生非常好的质量和足够好的性能,成为一个很好的默认选择。

因此,您不会为模型提供 GPU 单个纹理,而是为它提供一系列纹理,并让 GPU 关心如何对该链进行采样以提供正确的模糊量/锐度。为了提高性能和与 mipmap 的兼容性,通常最好使用二次方纹理(例如 1024x1024 而不是 1280x800)。

因此,只需使用 mipmap 和适当的过滤设置制作 1024x1024 或 2048x2048 纹理,然后在每个设备上使用它,无论其分辨率如何,然后根据质量进行排序。

如果您特别担心内存使用或加载时间,那么有一个论据可以减少较低分辨率设备上的纹理大小(基本上,为低分辨率设备提供分辨率减半的第二个资源,或者直接跳过最高分辨率mip 加载低分辨率设备时),但我认为现阶段这可能是一个过早的优化。

关于java - 根据分辨率更改 3D 模型纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58869483/

相关文章:

java - Google Wave 沙盒

java - 如何从 Android 后台线程更新 UI 元素?

c++ - 从鼠标坐标到 3d 的点-三角形相交?

python - Pyplot 3d 散点图 : points at the back overlap points at the front

java - 增加jfreechart中图例中的线条长度

java - Java 中人类可读格式的 SNMP EventTime

java - 通过成员注解获取外部类

android - 使用双 SIM 卡功能时如何获取 PhoneStateListener

android - 物联网请求响应协议(protocol)

algorithm - 检测 3D 模型中的平面