我正在尝试使用libgdx作为OpenGL包装器,并且在其图形渲染方面遇到了一些问题:
出于某种原因,在Android设备上使用libgdx查看所有图像(纹理)时,它们都会看起来有点模糊。这也包括文本(字体)。
对于文本,我认为这是因为我使用了位图字体,但我找不到替代品。我发现有一个名为“gdx-stb-truetype”的库,但我找不到如何下载和使用它的方法。
对于普通图像,即使我显示整个图像而没有任何缩放,我希望它看起来与我在计算机屏幕上看到的一样清晰,特别是如果设备上有如此好的屏幕(它是Galaxy Nexus)。我已经尝试关闭抗锯齿,使用以下代码:
作为一项测试,我找到了一个与设备上可见分辨率完全相同的清晰图像(对于Galaxy Nexus是720x1184,因为有按钮栏),并将其设置为Libgdx应用程序的背景。当然,我必须添加额外的空白空间以便加载纹理,因此图像的最终大小(将包括内容和空白空间)仍然是宽度和高度的2的幂次方(在这种情况下为1024x2048)。
在桌面应用程序中,它看起来不错。但是在设备上看起来模糊。
一个奇怪的事情是,当我改变设备的方向(水平<=>垂直)时,在旋转动画开始之前的非常短的时间内,我可以很清楚地看到图像和文本。
肯定Libgdx可以处理这个问题,因为Android的api-tests项目的OpenGL部分能够正常显示图像。
有人可以帮帮我吗?
@user1130529:我确实使用SpriteBatch。此外,以下是我用于设置视口的方法。无论是否选择保持宽高比,它都会出现这种情况。
对于文本,我认为这是因为我使用了位图字体,但我找不到替代品。我发现有一个名为“gdx-stb-truetype”的库,但我找不到如何下载和使用它的方法。
对于普通图像,即使我显示整个图像而没有任何缩放,我希望它看起来与我在计算机屏幕上看到的一样清晰,特别是如果设备上有如此好的屏幕(它是Galaxy Nexus)。我已经尝试关闭抗锯齿,使用以下代码:
final AndroidApplicationConfiguration androidApplicationConfiguration=new AndroidApplicationConfiguration();
androidApplicationConfiguration.numSamples=0; //tried the value of 1 too.
...
我也尝试过将缩放方法设置为不同的方法,但没有成功。例如:
texture.setFilter(TextureFilter.Nearest,TextureFilter.Nearest);
作为一项测试,我找到了一个与设备上可见分辨率完全相同的清晰图像(对于Galaxy Nexus是720x1184,因为有按钮栏),并将其设置为Libgdx应用程序的背景。当然,我必须添加额外的空白空间以便加载纹理,因此图像的最终大小(将包括内容和空白空间)仍然是宽度和高度的2的幂次方(在这种情况下为1024x2048)。
在桌面应用程序中,它看起来不错。但是在设备上看起来模糊。
一个奇怪的事情是,当我改变设备的方向(水平<=>垂直)时,在旋转动画开始之前的非常短的时间内,我可以很清楚地看到图像和文本。
肯定Libgdx可以处理这个问题,因为Android的api-tests项目的OpenGL部分能够正常显示图像。
有人可以帮帮我吗?
@user1130529:我确实使用SpriteBatch。此外,以下是我用于设置视口的方法。无论是否选择保持宽高比,它都会出现这种情况。
public static final int VIRTUAL_WIDTH =720;
public static final int VIRTUAL_HEIGHT =1280-96;
private static final float ASPECT_RATIO =(float)VIRTUAL_WIDTH/(float)VIRTUAL_HEIGHT;
...
@Override
public void resize(final int width,final int height)
{
// calculate new viewport
if(!KEEP_ASPECT_RATIO)
{
_viewport=new Rectangle(0,0,Gdx.app.getGraphics().getWidth(),Gdx.app.getGraphics().getHeight());
Gdx.app.log("DEBUG","size:"+_viewport);
return;
}
final float currentAspectRatio=(float)width/(float)height;
float scale=1f;
final Vector2 crop=new Vector2(0f,0f);
if(currentAspectRatio>ASPECT_RATIO)
{
scale=(float)height/(float)VIRTUAL_HEIGHT;
crop.x=(width-VIRTUAL_WIDTH*scale)/2f;
}
else if(currentAspectRatio<ASPECT_RATIO)
{
scale=(float)width/(float)VIRTUAL_WIDTH;
crop.y=(height-VIRTUAL_HEIGHT*scale)/2f;
}
else scale=(float)width/(float)VIRTUAL_WIDTH;
final float w=VIRTUAL_WIDTH*scale;
final float h=VIRTUAL_HEIGHT*scale;
_viewport=new Rectangle(crop.x,crop.y,w,h);
Gdx.app.log("DEBUG","viewport:"+_viewport+" originalSize:"+VIRTUAL_WIDTH+","+VIRTUAL_HEIGHT+" aspectRatio:"+ASPECT_RATIO+" currentAspectRatio:"+currentAspectRatio);
}