LibGDX帧缓冲缩放

6
我正在使用LibGDX框架开发一个绘画应用程序,我正在使用他们的FrameBuffer类将用户绘制的内容合并到一个实心纹理上,这就是用户看到的绘画。这一部分工作非常好,但是用户可以绘制的区域不总是相同的大小,我无法让它在除整个窗口之外的分辨率下正确显示。
我已经进行了非常详细的测试,似乎FrameBuffer在创建纹理时与窗口本身具有相同的分辨率,然后只是将其拉伸或缩小以适应实际所需的区域,对于任何大于或小于窗口的绘画来说,这都是非常不愉快的效果。
我已经验证了每个步骤,确保我从未自己进行拉伸,并且所有东西都按照正确的尺寸和位置绘制。我也查看了FrameBuffer类本身,试图找到答案,但奇怪的是,在那里我什么也没有发现,但考虑到我所做的所有测试,这似乎是唯一可能出现这个问题的地方。
我已经完全没有主意了,花费了相当多的时间来解决这个问题。

欢迎来到StackOverflow。如果您提出一个明确的问题并展示您已经尝试过什么,发生了什么等信息,您将会得到更好的回复。 - ethrbunny
我真的很想提出一个更具体的问题并提供更多细节,但考虑到问题的性质,我根本不知道应该集中注意什么,完全不知所措。如果有需要,我很乐意在请求时发布任何可能有助于解决问题的内容,但目前我甚至不确定在这里添加什么才会真正有帮助。 - Synthetik
2个回答

7
非常感谢Synthetik找到了核心问题。这里是解决这种情况的正确方法(我想是这样!)。
无论实际设备窗口大小如何,使帧缓冲区产生正确的比例和缩放纹理的方法是将投影矩阵设置为所需大小,如下所示:
SpriteBatch batch = new SpriteBatch();
Matrix4 matrix = new Matrix4();
matrix.setToOrtho2D(0, 0, 480,800); // here is the actual size you want
batch.setProjectionMatrix(matrix);

3
我相信我已经解决了我的问题,现在简要概述一下这个问题。
基本上,这个问题的原因在于SpriteBatch类中。具体来说,假设我没有使用过时的版本,问题出现在第181行,那里设置了投影矩阵。该行代码为:
        projectionMatrix.setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

这会导致所有绘制的内容实际上都是以窗口/屏幕的比例绘制的,然后在需要时被拉伸以适应。我不确定是否有更“正式”的处理方法,但我只是在SpriteBatch类中创建了另一种方法,允许我使用自己的尺寸再次调用此方法,并在必要时调用它。请注意,这并不是每次绘制或其他任何操作都需要执行,只需要执行一次,或者在尺寸发生变化时执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接