如何执行多遍着色器?

时间:2015-06-27 08:38:02

标签: opengl opengl-es opengl-es-2.0

我来自高斯可分(线性)模糊着色器的例子,因此将围绕它形成我的问题,但实际上我的问题更为一般。因此,为了应用线性模糊,您应首先在X方向上进行两次传递,然后在Y方向进行模糊,反之亦然。结果相当于方形复杂度高斯模糊着色器。但是在这里你应该保存第一遍的结果并在第二遍中使用它。为此,根据我的理解,应使用FBO渲染第一遍的结果,然后应从FBO中的数据创建纹理,并再次使用此纹理进行第二遍。但GPU工作高度并行,我不知道如何做到这一点不会阻止GPU。我在OpenGL中非常棒,我无法在不牺牲性能的情况下找到正确执行此操作的任何教程。

1 个答案:

答案 0 :(得分:1)

我会假设您询问移动设备,因为它标有OpenGLES。

你应该检查这个tutorial,它解释了如何使用额外的(可选的)技巧来实现“分离的”高斯滤波器以利用线性滤波。

如果不要求顶级质量,那么提高性能的一个好方法是在进行第一次(或每次)可分离传球时将FBO尺寸减少50%。

前:

  • FBO“A”100%包含要模糊的数据
  • 水平通过,小内核,输入为“A”,输出为50%FBO“B”
  • 垂直传递,小内核,输入“B”输出是50%FBO“C”
  • 您的模糊数据现在处于“C”状态,您可以重复此过程使其更加模糊(如果您不想进行更多降尺度,则打乒乓“B”和“C”)

这种将模糊通道与降尺度相结合的技术可以提供良好的结果。在移动设备上的性能,但你必须尝试在通过次数/内核大小/缩减之间找到一个很好的平衡。

在我这边,我更喜欢使用小内核,多次传递和大量降尺度(在绽放的情况下)。

是的,GPU将不得不等待传递完成才能启动另一个传递,但是,如果你的内核很小并且你使用缩减,那么我在移动设备上看到的这种速度非常快。