后处理和结果纹理

时间:2015-02-16 20:57:46

标签: opengl opengl-es-2.0 post-processing

我试图了解后期处理的工作原理。

根据我的理解,我需要这样的事情:

-> Bind render texture
-> Draw my scene
-> Unbind render texture
-> Draw a quad full screen using the resulting texture using a shader to apply an effect (blur, …)

该系统的问题是:如何在生成的四边形上应用多个效果?

在我看来,我认为应用"效果" (着色器)在得到的纹理然后绘制四边形他可能是最好的解决方案,但我不知道是否可能。

我可以直接在纹理上应用着色器吗?

PS:这是我目前所做的,我现在可以在纹理中绘制所有场景:

  
      
  • PostEffect类(要应用的效果)

  •   
  • EffectManager(创建输出纹理并有方法"添加(PostEffect *)"

  •   

2 个答案:

答案 0 :(得分:2)

我不知道你的意思"直接申请"着色到纹理,但要渲染具有特殊效果的纹理,您需要使用所需的着色器将全屏四边形渲染到屏幕,当然还要将纹理输入到着色器中。要获得多种效果,您需要使用两个帧缓冲区(ping-ponging),如下所示:

-> Bind 1st render texture
-> Draw scene

-> Bind 2nd render texture
-> Feed 1st render texture to a shader and draw quad

-> Bind 1st render texture
-> Feed 2nd render texture to another shader and draw quad

-> Bind 2nd render texture
-> Feed 1st render texture to a third shader and draw quad

...
-> Unbind
-> Draw quad

你不能连续两次渲染到同一个帧缓冲区,这就是你需要这样做的原因(见https://www.opengl.org/wiki/Framebuffer_Object#Feedback_Loops)。

如果可以的话,尝试将尽可能多的效果打包到同一个着色器中,以便在喂制服和绘图时将开销降至最低。

答案 1 :(得分:1)

后期处理技术可能会因您想要完成的内容而异。您可以编写一个应用多个后处理效果的着色器并一次渲染到纹理,或者如果渲染本质上是连续的,那么您需要一个双缓冲区:

render to texture 1
use texture one and render to texture 2
use texture 2 and render to texture 1
etc 
etc

并执行此操作,直到应用所有后期效果。但是,你应该将最后的传递直接渲染到你的屏幕渲染缓冲区,以避免代价高昂的复制'纹理到屏幕渲染缓冲区。

  

我可以直接在纹理上应用着色器吗?

不确定你的意思是什么。使用着色器的唯一时间是当您通过glDrawArrays或glDrawElements进行绘制调用时,假设您正确创建了FBO和RBO。所以是的,你必须使用某种全屏渲染技术。