java - 来自TextureAtlas的LibGDX缩放和渲染 Sprite

标签 java opengl textures libgdx sprite

我目前在绘制和缩放 Sprite 时遇到问题。

我正在从纹理图集中加载我的资源,我使用 LibGDX 纹理打包器 gui 工具将其打包没有问题。我的纹理图集图像目前看起来像这样。 pack iamge

这些图像应该是按钮,但正如您所看到的,图像非常小,因此当加载 Sprite 时,它们会加载一个例如 34x16 像素的 Sprite 。当我在 1920x1080 的 Canvas 上渲染这些按钮时,它们太小了。我使用 sprite.scale(int scale) 来缩放 Sprite ,但是当我缩放它们时,它们看起来很模糊。我希望发生的是,当它们缩放时,每个像素都按比例缩放,保持按钮上的像素化​​效果,而不是从非常小的纹理中调整大小的模糊图像。我目前使用 sprite.render(SpriteBatch batch) 渲染 Sprite 。使用 atlas.createSprite(String name) 加载 Sprite 后,这是渲染 Sprite 的正确方法吗?我对使用 Sprite 和从纹理图集中加载纹理不熟悉,所以我想知道这是否是正确的做法。

此外,当我初始化游戏时,我从TextureAtlas加载许多不同的Sprite对象。每个 Sprite 都拥有一个代表游戏对象的纹理,但据我了解,您使用 sprite.render(SpriteBatch batch) 渲染 Sprite ,因此我只能使用从TextureAtlas 对于一个游戏对象,因为我还必须设置 Sprite 的比例和位置,因为它代表游戏对象。我习惯于加载 Texture,然后在给定位置使用 batch.render() 渲染此纹理,但我不知道如果我这样做怎么可能我正在使用 Sprite 。即使我使用batch.render(Sprite, x, y),我也无法正确缩放 Sprite ,因为正如我之前提到的,我想在缩放 Sprite 的同时保持像素化效果,即便如此,使用 Sprite.scale() 方法,这会缩放 Sprite 对象作为一个整体,从而无法多次使用 Sprite 的纹理许多游戏对象。

如有任何建议,我们将不胜感激。

我当前用于渲染/加载 Sprite 的代码如下:

从TextureAtlas加载:

public static TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("data/texture/pack/output/pack.pack"));
    
public static Sprite sprite = atlas.createSprite("buttonUp");
sprite.setScale(10);

渲染 Sprite :GdxGame.WIDTH/HEIGHT 为 1920x1080。尽管桌面窗口是按比例缩小的。因此,所有内容都会呈现为 1920x1080 屏幕。

    batch = new SpriteBatch();
    camera = new OrthographicCamera(GdxGame.WIDTH, GdxGame.HEIGHT);
    camera.position.set(GdxGame.WIDTH/2, GdxGame.HEIGHT/2, 0);
    camera.setToOrtho(false, GdxGame.WIDTH, GdxGame.HEIGHT);
    
public void render(float delta){
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    batch.setProjectionMatrix(camera.combined);
    batch.begin();
            
    camera.update();
    sprite.draw(batch);
            
    batch.end();
}

经过进一步调查,我发现我可以使用 Sprite.set(Sprite sprite) 使 Sprite x 成为 Sprite y 的副本>,因此多次渲染每个 Sprite 。然而,这并没有解决缩放 Sprite 的问题。我必须进一步强调,当渲染缩放的 Sprite 时,缩放不是按像素完成的,这意味着它是模糊的。但是,在渲染 TextureRegion 时,如果宽度和高度大于原始纹理的宽度和高度,例如:batch.draw(TextureRegion, x, y, width, height) ,它会缩放每个像素,而不是模糊整个像素以尝试使其看起来更好。以下是我所说的模糊的图像:

enter image description here

请注意,尽管原始图像很小且像素化,但该 Sprite 是如何缩放为模糊的。

最佳答案

您在代码或纹理打包器中使用了哪些纹理过滤器设置?尝试“最近”过滤器。如果您将其设置为“线性”或类似的,它将始终采用 4 个纹理像素(纹素)并对它们进行插值以获得要绘制的像素的颜色。

这可能有助于消除模糊,但我不确定它是否会产生您想要的 8 位外观......

关于java - 来自TextureAtlas的LibGDX缩放和渲染 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825033/

相关文章:

java - 尝试打印时二分查找树的指针问题

java - JUnit异常 "Object is not an instance of declaring method"

java - 在 linux 上用 java 读取远程文件

c++ - 使用 directX 10 绘制大型 Sprite 时性能低下

c++ - glGenTextures 和 glGenSamplers 有什么区别?

c++ - Cuda 从黑白图像创建纹理对象

Java XML - 当我生成 XML 文件时,Java 将 me ' and "更改为 ' and "

c++ - glUniformMatrix4fv 导致 GL_INVALID_OPERATION

javascript - Node.js 在屏幕上绘图

opengl - 缓存 OpenGL 状态仍然有意义吗?