我试图了解后期处理的工作原理。
根据我的理解,我需要这样的事情:
-> 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 *)"
答案 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。所以是的,你必须使用某种全屏渲染技术。