使用framebuffers进行多通道渲染

时间:2016-01-23 15:16:29

标签: opengl render-to-texture multipass

我正在尝试进行多通道屏幕外渲染,我陷入了一个问题(更像是一个问题)。什么应该是捕获多次传球的概念?目前我得到了这个:

初始化:

Create FBO #1
Create FBO #2

Create Postprocess shader #1 (lighting)
Create Postprocess shader #2 (gamma, exposure, color control etc..)

渲染:

Bind FBO #1
RenderScene();
Unbind FBO

Bind FBO #2
Bind Postprocess shader #1
BIND FBO #1 TEXTURE ( with scene )
DRAWQUAD(); // And apply lighting etc..
Unbind;

// Now simply draw quad with FBO #1 texture.
Bind Postprocess shader #2 // Apply color corrections..
DRAWQUAD(); 
Unbind;

正如我在一些演示文稿中所读到的,使用多个FBO会更好,但有些人说使用单个FBO和切换附件会更好,但速度更快,但驱动程序更快可能验证太多(性能当然会受到影响)。 我使用OSX10.11,OpenGL profiler确实显示glBindFramebuffer比glFramebufferTexture(Layer ..,附件)慢x20。但是在这种情况下,如果我使用单个FBO,我应该如何渲染到纹理?因为现在我不能做DRAWQUAD();两次..如果我能够使用具有不同附件的单个FBO,我的想法示例。

初始化:

Create FBO #1 // Only one frame buffer.

Create Postprocess shader #1 (lighting)
Create Postprocess shader #2 (gamma, exposure, color control etc..) 

渲染:

Bind FBO #1 
RenderScene()

..在这个舞台上我该怎么办?因为FBO是由场景数据填充的,我不能只是DRAWQUAD();这里。

编辑:这是正确的事吗?

    // glBindFramebuffer #1
    // draw to layer 0
    // glUnbind

    // glBindFramebuffer #1
    // draw to layer 1 texture from layer 0 ( quad )
    // glUnbind

    // glBindFramebuffer #1
    // draw to layer 2 texture from layer 1 ( quad too )
    // glUnbind

    // ... and simply draw quad with layer 2 texture

0 个答案:

没有答案