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

时间:2019-11-15 02:26:24

标签: 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等制作一些纹理图集。问题是我不知道如何替换从一开始就已经与Model集成在一起的纹理图集?因此,按比例放大时,纹理图集会自动替换为更高的图集。谢谢

1 个答案:

答案 0 :(得分:0)

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

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

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

因此,只需使用mipmap和适当的过滤设置制作1024x1024或2048x2048纹理,然后在每台设备上使用它,而不管其分辨率如何,然后按质量进行分类即可。

如果您特别担心内存的使用或加载时间,那么可以考虑减小分辨率较低的设备上的纹理大小(基本上,对于低分辨率设备,第二个资产的分辨率减半,或者只是跳过最高分辨率)在为低分辨率设备加载时会出现mip),但我认为这可能是现阶段的过早优化。