2015-01-25 3 views
1

Чтобы создать эффект размытия, теория утверждает, что создается 2 вершинных шейдера, одна для горизонтального прохода, вторая для вертикального прохода. И затем один фрагмент шейдера для фактической выборки.Как выполнить 2 прохода для эффекта размытия в openGL ES 2.0

Мой вопрос в том, как на самом деле выполнить 2 вершинных шейдера? Нужно ли рисовать, а затем возвращать пиксели через glReadPixels, а затем снова отображать?

Моей среда Android, OpenGL ES 2.0

Благодаря

ответ

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^