6

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

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

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

除非我可以将它组合成一个着色器,否则 FBO 是否适合我?

我对 OpenGL 有点陌生(以防你不知道)。

谢谢!

西蒙

4

2 回答 2

5

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

于 2011-03-21T15:26:07.793 回答
3

实际上,乒乓球渲染非常适合这个目的!这是一个在 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();

对 pong 的明确调用(在我的情况下,创建一个新的帧缓冲区)是昂贵的,因此预分配可能会提供一些加速。这更像是对 Matias 回答的后续行动,而不是回答本身,但不适合发表评论。

于 2015-04-15T02:55:09.547 回答