我在使用绘制方法使用 FrameBuffer 的自定义 Scene2D actor 时遇到了一些问题。最初的想法是使用一个着色器绘制到 FrameBuffer,然后使用另一个着色器将 FrameBuffer 的内容绘制到屏幕,但这必须等待。我现在遇到的问题是如何让 FrameBuffer 的内容正确填充我期望 Actor 在屏幕上占据的空间。经过多次实验,我得到了一些似乎有效的东西,但我仍然不明白为什么它有效。
绘制方法如下:
@Override
public void draw(Batch batch, float parentAlpha) {
batch.end();
buffer.begin();
ScreenUtils.clear(1,0,0,1);
batch.begin();
batch.draw(texture,0,0,640,640); // This is the window size!
batch.end();
buffer.end();
batch.begin();
batch.draw(buffer.getColorBufferTexture(),
getX(),
getY(),
getWidth(),
getHeight(),
0,
0,
buffer.getColorBufferTexture().getWidth(),
buffer.getColorBufferTexture().getHeight(),
false,
true);
}
我知道 FrameBuffer 使用像素坐标,而不是 Scene2D 用于 Actor 位置和大小的“世界”坐标。我不明白的是,为什么如果以小于实际窗口大小的任何值将纹理渲染到 FrameBuffer,则来自 FrameBuffer 的颜色缓冲区纹理将以小于屏幕上 Actor 的大小进行渲染。
我想我正在寻找以下问题的答案。
(1) FrameBuffer 的大小应该是多少?
我最初的想法是它应该是我打算绘制的纹理的大小。
(2) 当我绘制到 FrameBuffer 时,我应该使用不同的投影矩阵吗?
我对正确解决方案的最佳猜测是,当我绘制到 FrameBuffer 时,我应该更改 SpriteBatch 的投影矩阵,以考虑到 FrameBuffer 与应用程序窗口大小不同的事实。不幸的是,我无法在网上找到有用的示例或教程。