如何在 openGL ES 2.0 中执行 2 次模糊效果
How to execute 2 passes for a blur effect in openGL ES 2.0
为了创建模糊效果,理论上创建 2 个顶点着色器,一个用于水平通道,第二个用于垂直通道。然后是一个用于实际采样的片段着色器。
我的问题是,如何实际执行 2 个顶点着色器?我是否需要渲染,然后通过 glReadPixels 取回像素,然后再次渲染?
我的环境是Android,OpenGL ES 2.0
谢谢
您可以将第一遍渲染到 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.
为了创建模糊效果,理论上创建 2 个顶点着色器,一个用于水平通道,第二个用于垂直通道。然后是一个用于实际采样的片段着色器。
我的问题是,如何实际执行 2 个顶点着色器?我是否需要渲染,然后通过 glReadPixels 取回像素,然后再次渲染?
我的环境是Android,OpenGL ES 2.0
谢谢
您可以将第一遍渲染到 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.