组合多个opengl片段着色器

时间:2011-03-21 09:39:04

标签: image-processing opengl-es fragment-shader

我想使用OpenGL ES将一些图像处理工作移植到OpenGL以获得性能。我有一个非常简单的阈值算法,但我想将其他滤镜组合到图像中(例如对比度)。

我的第一个想法是通过使用多个片段着色器来完成此操作。但是,我想很快就这样做,这会导致很多状态变化吗?我读过的唯一方法是通过处理纹理然后多次调用“使用程序”来做到这一点。

有更有效的方法吗?理想情况下,我想将对比度拉伸和直方图平衡作为步骤的一部分。

除非我能将其合并为一个着色器,否则FBO会在这里为我工作吗?

我对OpenGL有点新鲜(如果你不知道的话)。

谢谢!

西蒙

2 个答案:

答案 0 :(得分:4)

除非您手动执行,否则无法“合并”片段着色器,因此唯一合理的选择是使用FBO进行“乒乓”渲染。您有2个FBO,绘制为1并从另一个读取,然后切换FBO并重复,在渲染之间切换片段着色器。

答案 1 :(得分:1)

实际上,Ping pong渲染非常适合这个目的!这是一个在LibGDX中工作的代码示例,其中有一个实际绘制到屏幕的“批处理”对象,我们可以使用FrameBuffers捕获的输入:

FrameBuffer ping = fbo; // the framebuffer containing your rendered texture
for (ShaderProgram shader : shaders) {
    pong.clear();
    pong.begin();
    batch.begin();
    batch.setShader(shader);
    batch.draw(ping.getColorBufferTexture(), 0, 0, width, height);
    batch.end();
    pong.end();
    ping = pong;
}
batch.begin();
batch.draw(pong.getColorBufferTexture(), 0, 0, width, height);
batch.end();

对乒乓球的明确调用(在我的情况下,制作新的帧缓冲区)是昂贵的,因此预分配可能会提供一些加速。这更像是Matias答案的后续,而不是答案本身,但不适合评论。