2

我试图了解后处理是如何工作的。

据我了解,我需要这样做:

-> 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(创建输出纹理并有一个方法“add(PostEffect*)”

4

2 回答 2

2

我不知道“直接将”着色器应用于纹理是什么意思,但是要渲染具有特殊效果的纹理,您需要使用所需的着色器将全屏四边形渲染到屏幕上,当然还要将纹理输入着色器。要获得多种效果,您需要使用两个帧缓冲区(乒乓),如下所示:

-> 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)。

如果可以的话,尝试将尽可能多的效果打包到同一个着色器中,以最大限度地减少输入制服和绘图时的开销。

于 2015-02-16T21:12:34.173 回答
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。所以是的,您必须使用某种全屏渲染技术。

于 2015-02-16T21:12:46.317 回答