我正在使用LibGDX框架处理绘图应用程序,我正在使用他们的FrameBuffer类将用户绘制的内容合并到实体纹理上,这就是他们所看到的绘图。这个方面工作得很好,但是,用户可以绘制的区域并不总是大小相同,而且我无法在除整个窗口以外的分辨率上正确显示它。
我已经对此进行了非常广泛的测试,看起来似乎正在发生的事情是FrameBuffer以与窗口本身相同的分辨率创建纹理,然后简单地拉伸或缩小它以适应它所要求的实际区域对于任何大于或小于窗户的图纸,这是一种非常不愉快的效果。
我已经在我的过程中的每一步都证实了我自己从未做过任何这样的伸展,并且正确地绘制了所有内容,以及正确的尺寸和位置。我也查看了FrameBuffer类本身试图找到答案,但奇怪的是也没有找到任何东西,但是,考虑到我所做的所有测试,它似乎是这个问题的唯一可能的地方以某种方式创造。
我完全没有想法,花了相当多的时间来解决这个问题。
答案 0 :(得分:6)
非常感谢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);
答案 1 :(得分:3)
我相信我已经解决了我的问题,并且我将简要概述问题所在。
基本上,这个问题的原因在于SpriteBatch类。具体来说,假设我没有使用类的过时版本,问题出在第181行,其中设置了投影矩阵。这一行:
projectionMatrix.setToOrtho2D(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
这导致绘制的所有内容基本上都是在窗口/屏幕的比例下绘制,然后拉伸到适合其后需要的位置。我不确定是否有更“正确”的方法来处理这个问题,但我只是在SpriteBatch类中创建了另一个方法,它允许我再次使用自己的维度调用此方法,并在必要时调用它。请注意,每次抽奖或类似的任何内容都不需要,只需要一次,或任何时候尺寸可能会改变。