вы можете сделать первый проход к 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.