gpt4 book ai didi

libgdx 嵌套 FrameBuffer

转载 作者:行者123 更新时间:2023-12-03 21:35:41 26 4
gpt4 key购买 nike

我使用 FBO 在我的 LevelScreen 渲染方法中渲染多 channel 模糊着色器。我想要实现的是制作一个 MenuScreen,它在背景上渲染 LevelScreen,在它上面应用另一个模糊效果。

这是伪代码

    protected void render(float delta) {
// render the scene to the FBO
fbo.begin();
levelScreen.render(delta);
fbo.end();

// retrieve texture and flip Y
Sprite background = new Sprite(fbo.getColorBufferTexture());
background.flip(false, true);

// apply the blurX shader and
// render the sprite
batch.setShader(blurH);
batch.begin();
background.draw(batch);
batch.end();
}

问题在于 levelScreen.render()函数已经包含一个 fbo.begin() fbo.end()并且场景直接渲染在屏幕上。

有没有办法正确处理嵌套的 fbo?

最佳答案

您可以手动处理事情,使用自定义类来处理 FrameBuffers,可能由 Stack 支持,使用类似 startRender(FrameBuffer) 的方法和 endRender()它将正确管理事物,例如关闭旧的 FrameBuffer 并打开新的,等等。

此外,尽量避免在渲染方法中创建新对象。

Sprite background = new Sprite(fbo.getColorBufferTexture());

如果这是一个字段,这应该可以正常工作。

编辑:

如果我理解正确,您当前的问题如下所示:
FrameBuffer fb1 = ..., fb2 = ...;
fb1.begin();
// draw something on fb1
fb2.begin();
// draw something on fb2
fb2.end();
// draw something on fb1 again
fb1.end();

但是您不能同时打开多个 FrameBuffer,对吗?因此,创建一个基于堆栈的类来为您管理 FrameBuffers,可以做一些简单的事情:
class FrameBufferManager {
private Stack<FrameBuffer> stack = new Stack<FrameBuffer>();

public void begin(FrameBuffer buffer) {
if (!stack.isEmpty()) {
stack.peek().end();
}
stack.push(buffer).begin();
}

public void end() {
stack.pop().end();
if (!stack.isEmpty()) {
stack.peek().begin();
}
}
}

然后你像这样使用它:
FrameBuffer fb1 = ..., fb2 = ...;
FrameBufferManager manager = ...;

manager.begin(fb1);
// draw something on fb1
manager.begin(fb2);
// draw something on fb2
manager.end();
// draw something on fb1 again
manager.end();

但是,无论是否有经理,我都没有尝试过,但它应该可以解决您的问题。我不确定每次更改 FrameBuffer 时是否需要重新打开渲染器和批处理(我通常这样做)。

关于libgdx 嵌套 FrameBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com