Opengl 后处理和生成的纹理

Opengl 后处理和生成的纹理,opengl,opengl-es-2.0,post-processing,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, …) 该系统的问题是:如何在生成的四边形上应用多重效果 在我看来,我认为在生成的纹理上应用“效果

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

据我所知,我需要这样做:

-> 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:这是我目前所做的,我现在可以用纹理绘制我的所有场景:

  • 后期效果类(要应用的效果)

  • EffectManager(创建输出纹理并使用“添加(后期效果*)”方法)


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

-> 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
不能在同一帧缓冲区中一行渲染两次,这就是为什么需要这样做(请参见)


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

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

render to texture 1
use texture one and render to texture 2
use texture 2 and render to texture 1
etc 
etc
直到所有的后期效果都被应用,然后你应该把最后一个过程直接渲染到你的屏幕渲染缓冲区,以避免昂贵的纹理“复制”到屏幕渲染缓冲区

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

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