5

我正在使用 LibGDX 框架开发一个绘画应用程序,并且我正在使用他们的 FrameBuffer 类将用户绘制的内容合并到一个实体纹理上,这就是他们所看到的他们的绘图。这方面工作得很好,但是,用户可以绘制的区域并不总是相同的大小,而且我很难让它在整个窗口以外的分辨率上正确显示。

我已经对此进行了非常广泛的测试,似乎正在发生的事情是 FrameBuffer 正在以与窗口本身相同的分辨率创建纹理,然后简单地拉伸或收缩它以适应它应该位于的实际区域,即对于任何大于或小于窗口的绘图,都会产生非常不愉快的效果。

我已经验证,在我的过程的每一步,我从来没有做任何这样的伸展自己,并且所有的东西都是以正确的尺寸和位置绘制的。我还研究了 FrameBuffer 类本身以尝试找到答案,但奇怪的是在那里也没有发现任何东西,但是,鉴于我所做的所有测试,它似乎是这个问题唯一可能出现的地方以某种方式创建。

我完全没有想法,花了相当多的时间试图解决这个问题。

4

2 回答 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);
于 2013-01-16T00:19:53.180 回答
3

我相信我已经解决了我的问题,我将简要概述问题所在。

基本上,这个问题的原因在于 SpriteBatch 类。具体来说,假设我没有使用该类的过时版本,问题出在第 181 行,其中设置了投影矩阵。该行:

        projectionMatrix.setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

这导致所有被绘制到的东西,本质上,都是按照窗口/屏幕的比例绘制的,然后被拉伸以适应它需要的位置。我不确定是否有更“正确”的方法来处理这个问题,但我只是在 SpriteBatch 类中创建了另一个方法,它允许我用自己的尺寸再次调用这个方法,并在必要时调用它。请注意,并非每次抽奖或类似的事情都需要它,只有一次或任何时候尺寸可能会改变。

于 2013-01-02T04:43:21.490 回答