【问题标题】:Post processing and resulting texture后处理和生成的纹理
【发布时间】:2015-04-17 11:35:55
【问题描述】:

我正在尝试了解后处理的工作原理。

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

-> 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*)”

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      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。所以是的,你必须使用某种全屏渲染技术。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        相关资源
        最近更新 更多