为了创建模糊效果,理论上说要创建2个顶点着色器,一个用于水平传递,第二个用于垂直传递。然后是一个片段着色器进行实际采样。
我的问题是,如何实际执行2个顶点着色器?我是否需要渲染,然后通过glReadPixels返回像素,然后再渲染?
我的环境是Android,OpenGL ES 2.0
由于
答案 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.