根据分辨率更改 3d 模型纹理
Changing 3d model texture based on resolution
据我所知,您可以使用 Gdx.graphics.getDensity() 获取屏幕尺寸和密度,因此您可以为例如 1x、1.5x 等加载正确的纹理。
但是 3D 模型附带的纹理呢?纹理仅适用于最大 1280x800px,而我的 android 的 dpi 为 3x。
我不想缩放太多,因为它会导致图像变得太锐利 blur/fade/not,有人知道解决方案吗?
编辑:
让我详细解释一下
- 我有一个 ModelInstance,附有纹理图集 (2048x2048px)。
- 在4k屏幕下打开游戏时,我将模型的比例加宽了近三倍,导致纹理变得模糊,这是有道理的,因为从240dpi到640dpi差异很大。
所以在我看来,解决方案是为 240dpi、320dpi、480dpi 等制作一些纹理图集。问题是我不知道如何替换从一开始就已经与模型集成的纹理图集?所以当放大时,纹理图集会自动替换为更高的图集。谢谢
通常在 3D 图形中,相机或模型是可移动的。纹理没有固定的最佳分辨率,因为相机可能非常近,非常远或以掠射角查看纹理表面。
图形API提供的解决方案是纹理过滤的设置。在放大情况下(纹素占用超过屏幕像素的位置),您可以对软边缘进行线性过滤或对硬边缘进行点过滤。缩小更复杂,你可以有线性或点过滤,但你也可以有 mipmaps,这是一个预先计算的连续半尺寸版本的图像链,通常一直到 1x1。您可以设置纹理过滤以选择最近的 mipmap,在 mipmap 之间混合,或使用各向异性过滤以获得更好的掠射角清晰度。通常用于放大的线性过滤和用于缩小的具有各向异性过滤的完整 mipmap 链产生非常好的质量和足够好的性能,是一个很好的默认选择。
因此,您不会为您的模型为 GPU 提供单一纹理,而是为它提供一系列纹理,并让 GPU 考虑如何对该链进行采样以提供正确数量的纹理blur/sharpness。为了性能和与 mipmap 的兼容性,使用二次方纹理通常是个好主意(例如 1024x1024 而不是 1280x800)。
因此,只需使用 mipmap 和适当的过滤设置制作 1024x1024 或 2048x2048 纹理,然后在每个设备上使用它,而不管其分辨率如何,然后按质量对您进行排序。
如果您特别担心内存使用或加载时间,那么可以减少低分辨率设备上的纹理大小(基本上,为低分辨率设备准备第二个分辨率减半的资源,或者直接跳过为低分辨率设备加载时的最高分辨率 mip),但我认为现阶段这可能是过早的优化。
据我所知,您可以使用 Gdx.graphics.getDensity() 获取屏幕尺寸和密度,因此您可以为例如 1x、1.5x 等加载正确的纹理。
但是 3D 模型附带的纹理呢?纹理仅适用于最大 1280x800px,而我的 android 的 dpi 为 3x。
我不想缩放太多,因为它会导致图像变得太锐利 blur/fade/not,有人知道解决方案吗?
编辑: 让我详细解释一下
- 我有一个 ModelInstance,附有纹理图集 (2048x2048px)。
- 在4k屏幕下打开游戏时,我将模型的比例加宽了近三倍,导致纹理变得模糊,这是有道理的,因为从240dpi到640dpi差异很大。
所以在我看来,解决方案是为 240dpi、320dpi、480dpi 等制作一些纹理图集。问题是我不知道如何替换从一开始就已经与模型集成的纹理图集?所以当放大时,纹理图集会自动替换为更高的图集。谢谢
通常在 3D 图形中,相机或模型是可移动的。纹理没有固定的最佳分辨率,因为相机可能非常近,非常远或以掠射角查看纹理表面。
图形API提供的解决方案是纹理过滤的设置。在放大情况下(纹素占用超过屏幕像素的位置),您可以对软边缘进行线性过滤或对硬边缘进行点过滤。缩小更复杂,你可以有线性或点过滤,但你也可以有 mipmaps,这是一个预先计算的连续半尺寸版本的图像链,通常一直到 1x1。您可以设置纹理过滤以选择最近的 mipmap,在 mipmap 之间混合,或使用各向异性过滤以获得更好的掠射角清晰度。通常用于放大的线性过滤和用于缩小的具有各向异性过滤的完整 mipmap 链产生非常好的质量和足够好的性能,是一个很好的默认选择。
因此,您不会为您的模型为 GPU 提供单一纹理,而是为它提供一系列纹理,并让 GPU 考虑如何对该链进行采样以提供正确数量的纹理blur/sharpness。为了性能和与 mipmap 的兼容性,使用二次方纹理通常是个好主意(例如 1024x1024 而不是 1280x800)。
因此,只需使用 mipmap 和适当的过滤设置制作 1024x1024 或 2048x2048 纹理,然后在每个设备上使用它,而不管其分辨率如何,然后按质量对您进行排序。
如果您特别担心内存使用或加载时间,那么可以减少低分辨率设备上的纹理大小(基本上,为低分辨率设备准备第二个分辨率减半的资源,或者直接跳过为低分辨率设备加载时的最高分辨率 mip),但我认为现阶段这可能是过早的优化。