如何在openGL ES 2.0中为模糊效果执行2次传递

时间:2015-01-25 14:41:41

标签: android opengl-es glsles

为了创建模糊效果,理论上说要创建2个顶点着色器,一个用于水平传递,第二个用于垂直传递。然后是一个片段着色器进行实际采样。

我的问题是,如何实际执行2个顶点着色器?我是否需要渲染,然后通过glReadPixels返回像素,然后再渲染?

我的环境是Android,OpenGL ES 2.0

由于

1 个答案:

答案 0 :(得分:3)

您可以将第一个传递渲染到FBO,然后在将第二个传递渲染到默认帧缓冲区时使用生成的纹理。

如果要模糊的图像位于名称为inputTexId的纹理中,则以下是代码外观的概述。您没有指定是否使用C ++或Java。以下使用C ++绑定,但它在Java中看起来非常相似。

在设置过程中,您创建一个FBO和一个纹理,用于包含第一个渲染过程的结果:

GLuint pass1TexId = 0;
glGenTextures(1, &pass1TexId);
glBindTexture(GL_TEXTURE_2D, pass1TexId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
             GL_RGB, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                       GL_TEXTURE_2D, pass1TexId, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

每次要应用模糊滤镜时,都将此FBO用作第一个渲染过程的渲染目标,并将原始图像作为输入:

glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glBindTexture(GL_TEXTURE_2D, inputTexId);
// Set up shaders and state for first blur pass, and render.

然后对于第二遍,你渲染到默认的帧缓冲区,并使用第一遍产生的纹理作为输入:

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, pass1TexId);
// Set up shaders and state for second blur pass, and render.