如何执行多通道着色器?
How to execute multipass shaders?
我来自高斯可分离(线性)模糊着色器的示例,因此将围绕它形成我的问题,但实际上我的问题更笼统。因此,为了应用线性模糊,您应该首先在 X 方向进行两次模糊处理,然后在 Y 方向进行模糊处理,反之亦然。结果相当于平方复杂度高斯模糊着色器。但是在这里你应该保存第一遍的结果并在第二遍中使用它。为此,据我所知,应该使用 FBO 来渲染第一遍的结果,然后应该根据 FBO 中的数据创建纹理,然后再次使用该纹理进行第二遍。但是 GPU 高度并行工作,我不知道我该怎么做才能不拖慢 GPU。我是 OpenGL 的菜鸟,我找不到任何教程可以在不牺牲性能的情况下正确执行此操作。
我假设你问的是移动设备,因为这是用 OpenGLES 标记的。
您应该查看此 tutorial,它解释了如何使用额外(可选)技巧实现 "separated" 高斯滤波器以利用线性过滤。
如果不需要一流的质量,提高性能的一个好方法是在执行第一个(或每个)可分离通道时将 FBO 尺寸减少 50%。
例如:
- FBO "A" 100% 包含要模糊的数据
- 水平传递,小内核,输入是"A",输出是50% FBO"B"
- 垂直传递,小内核,输入是 "B" 输出是 50% FBO "C"
- 您的模糊数据现在在 "C" 中,您可以重复该过程以使其更加模糊(如果您不想进一步缩减,则乒乓 "B" 和 "C")
这种将模糊通道与缩小相结合的技术在移动设备上提供了良好的结果和性能,但您必须进行试验才能在通道数/内核大小/缩小之间找到良好的平衡。
在我这边,我更喜欢使用小内核、多遍和大量缩减(在开花的情况下)。
是的,GPU 必须等待一个通道完成才能开始另一个通道,但是,从我在移动设备上看到的情况来看,如果您的内核很小并且您使用缩小比例,这会非常快。
我来自高斯可分离(线性)模糊着色器的示例,因此将围绕它形成我的问题,但实际上我的问题更笼统。因此,为了应用线性模糊,您应该首先在 X 方向进行两次模糊处理,然后在 Y 方向进行模糊处理,反之亦然。结果相当于平方复杂度高斯模糊着色器。但是在这里你应该保存第一遍的结果并在第二遍中使用它。为此,据我所知,应该使用 FBO 来渲染第一遍的结果,然后应该根据 FBO 中的数据创建纹理,然后再次使用该纹理进行第二遍。但是 GPU 高度并行工作,我不知道我该怎么做才能不拖慢 GPU。我是 OpenGL 的菜鸟,我找不到任何教程可以在不牺牲性能的情况下正确执行此操作。
我假设你问的是移动设备,因为这是用 OpenGLES 标记的。
您应该查看此 tutorial,它解释了如何使用额外(可选)技巧实现 "separated" 高斯滤波器以利用线性过滤。
如果不需要一流的质量,提高性能的一个好方法是在执行第一个(或每个)可分离通道时将 FBO 尺寸减少 50%。
例如:
- FBO "A" 100% 包含要模糊的数据
- 水平传递,小内核,输入是"A",输出是50% FBO"B"
- 垂直传递,小内核,输入是 "B" 输出是 50% FBO "C"
- 您的模糊数据现在在 "C" 中,您可以重复该过程以使其更加模糊(如果您不想进一步缩减,则乒乓 "B" 和 "C")
这种将模糊通道与缩小相结合的技术在移动设备上提供了良好的结果和性能,但您必须进行试验才能在通道数/内核大小/缩小之间找到良好的平衡。
在我这边,我更喜欢使用小内核、多遍和大量缩减(在开花的情况下)。
是的,GPU 必须等待一个通道完成才能开始另一个通道,但是,从我在移动设备上看到的情况来看,如果您的内核很小并且您使用缩小比例,这会非常快。