2011-03-21 142 views
3

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

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

有没有更有效的方法来做到这一点?理想情况下,我希望执行对比度拉伸和直方图平衡作为步骤的一部分。

除非我可以将它组合成单个着色器,否则FBO会为我工作吗?

我对OpenGL有点新(如果你看不清)。

谢谢!

西蒙

回答

4

你不能“合并”片段着色器,除非你做手工,所以,唯一理智的选择就是做“乒乓”的渲染宗教组织使用。你有2个FBO,吸引到另一个FBO,然后切换FBO并重复,在渲染之间切换片段着色器。

+0

感谢您的支持。你有样品(伪代码或其他)吗? – Simon 2011-03-23 07:58:56

+0

示例代码如下所示: – Daryl 2015-04-15 02:46:02

1

乒乓渲染对于这个目的非常好,实际上!这里的内LibGDX,那里是一个“批”的对象,实际上吸引到屏幕上一个可行的代码示例中,输入我们可以与帧缓冲区捕捉:

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(); 

清晰的通话,以乒乓(在我的情况,制作一个新的帧缓冲器)是昂贵的,所以预分配可能会提供一些加速。这更像是马蒂亚斯回答的后续,而不是回答本身,但不适合发表评论。