2011-04-25 13 views
5

He llegado a otro punto muerto que no puedo resolver por mi cuenta. Realmente espero que alguien pueda ayudarme.openGL/GLSL: bloom/blur, representación en FBO

He estado intentando crear un pequeño efecto de floración usando GLSL, que funcionó bastante bien. Cuando traté de incluir algo en mi escena, noté que olvidé borrar mis FBO antes de renderizarlos.

Sin borrar funcionó para nunca cambiar las escenas porque siempre estaba usando la misma textura. Con glClear(); comando todavía funciona, pero para el primer cuadro solamente, todo lo que obtengo después es una pantalla negra. Así que supongo que mi problema es que no puedo hacer que mis FBO se actualicen continuamente en cada fotograma.

Siento que me falta algo muy obvio o estoy haciendo algo terriblemente incorrecto.

Estaría agradecido por cualquier sugerencia que pueda tener.

Esto es lo que me pasa por el primer cuadro: enter image description here

Fuentes: (utilizando Openframeworks)

configuración:

void testApp::setup(){ 

ofSetVerticalSync(true); 
ofDisableSetupScreen(); 

width = ofGetWidth(); 
height = ofGetHeight(); 

//complie/link/generate ShaderObjects .... 
horizontalBlurFrag.load("/opt/openframeworks/apps/examples/FBO_basic_shader_new_continued_v4_2/bin/data/fragment_shader_horizontal.glsl", GL_FRAGMENT_SHADER); 
verticalBlurFrag.load("/opt/openframeworks/apps/examples/FBO_basic_shader_new_continued_v4_2/bin/data/fragment_shader_vertical.glsl", GL_FRAGMENT_SHADER); 
BlurVertex.load("/opt/openframeworks/apps/examples/FBO_basic_shader_new_continued_v4_2/bin/data/horizontal_blur.glsl", GL_VERTEX_SHADER); 
blendTextures.load("/opt/openframeworks/apps/examples/FBO_basic_shader_new_continued_v4_2/bin/data/blend_shader.glsl", GL_FRAGMENT_SHADER); 

fboOriginal.initialize(width, height); 
fboH800.initialize(width, height); 
fboV800.initialize(width, height); 
fboH400.initialize(width, height); 
fboV400.initialize(width, height);} 

sorteo:

void testApp::draw(){ 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

//set orthographic projection 
glOrtho(-1, 1, -1, 1, 1.0, 40.0); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glViewport(0, 0, width, height); 

glDisable(GL_TEXTURE_2D); 

fboOriginal.bind(); 

    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushAttrib(GL_VIEWPORT_BIT); 
     glViewport(0, 0, width, height); 
     glPushMatrix(); 
      glScalef(0.1f, 0.1f, 1.0f); 

      //generating values between 0 and 2 
      float x = 2 * (sin(time)+1.000001)/2; 

      //drawSOlidRect(xPos, yPos, width, height, red, green, blue); 
      drawSolidRect(-8.0f, 8.0f, x, x, 0.4f, 0.4f, 1.0f); 
      drawSolidRect(-5.0f, 8.0f, x, x, 0.4f, 1.0f, 0.4f); 
      drawSolidRect(-2.0f, 8.0f, x, x, 0.4f, 1.0f, 1.0f); 
      drawSolidRect(1.0f, 8.0f, x, x, 1.0f, 0.4f, 0.4f); 
      drawSolidRect(4.0f, 8.0f, x, x, 1.0f, 0.4f, 1.0f); 
      drawSolidRect(7.0f, 8.0f, x, x, 1.0f, 1.0f, 0.4f); 
     glPopMatrix(); 
    glPopAttrib(); 
fboOriginal.unbind(); 

glEnable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, fboOriginal.fboTexture); 

BlurVertex.enable(); 

horizontalBlurFrag.enable(); 
glUniform1i(glGetUniformLocation(horizontalBlurFrag.program, "RTScene"), 0); 

glDisable(GL_TEXTURE_2D); 

fboH800.bind(); 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushAttrib(GL_VIEWPORT_BIT); 
     glViewport(0, 0, width, height); 
     glPushMatrix(); 
      glBegin(GL_QUADS); 
       glColor3f(1.0f, 1.0f, 1.0f); 

       glTexCoord2f(0.0f, 1.0f); 
       glVertex3f(-1.0, 1.0, -1.0); 

       glTexCoord2f(1.0f, 1.0f); 
       glVertex3f(1.0, 1.0, -1.0); 

       glTexCoord2f(1.0f, 0.0f); 
       glVertex3f(1.0, -1.0, -1.0); 

       glTexCoord2f(0.0f, 0.0f); 
       glVertex3f(-1.0, -1.0, -1.0); 
      glEnd(); 
     glPopMatrix(); 
    glPopAttrib(); 
glDisable(GL_TEXTURE_2D); 
fboH800.unbind(); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, fboH800.fboTexture); 

BlurVertex.enable(); 

verticalBlurFrag.enable(); 
glUniform1i(glGetUniformLocation(verticalBlurFrag.program, "RTBlurH"), 0); 

glDisable(GL_TEXTURE_2D); 

fboV800.bind(); 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushAttrib(GL_VIEWPORT_BIT); 
     glViewport(0, 0, width, height); 
     glPushMatrix(); 
      glBegin(GL_QUADS); 
       glColor3f(1.0f, 1.0f, 1.0f); 

       glTexCoord2f(0.0f, 1.0f); 
       glVertex3f(-1.0, 1.0, -1.0); 

       glTexCoord2f(1.0f, 1.0f); 
       glVertex3f(1.0, 1.0, -1.0); 

       glTexCoord2f(1.0f, 0.0f); 
       glVertex3f(1.0, -1.0, -1.0); 

       glTexCoord2f(0.0f, 0.0f); 
       glVertex3f(-1.0, -1.0, -1.0); 
      glEnd(); 
     glPopMatrix(); 
    glPopAttrib(); 
fboV800.unbind(); 

glEnable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, fboV800.fboTexture); 

BlurVertex.enable(); 

horizontalBlurFrag.enable(); 
glUniform1i(glGetUniformLocation(horizontalBlurFrag.program, "RTScene"), 1); 

glDisable(GL_TEXTURE_2D); 

fboH400.bind(); 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushAttrib(GL_VIEWPORT_BIT); 
     glPushMatrix(); 
     glViewport(0, 0, width/4, height/4); //crude downscale 
      glBegin(GL_QUADS); 
       glColor3f(1.0f, 1.0f, 1.0f); 

       glTexCoord2f(0.0f, 1.0f); 
       glVertex3f(-1.0, 1.0, -1.0); 

       glTexCoord2f(1.0f, 1.0f); 
       glVertex3f(1.0, 1.0, -1.0); 

       glTexCoord2f(1.0f, 0.0f); 
       glVertex3f(1.0, -1.0, -1.0); 

       glTexCoord2f(0.0f, 0.0f); 
       glVertex3f(-1.0, -1.0, -1.0); 
      glEnd(); 
     glPopMatrix(); 
    glPopAttrib(); 
glDisable(GL_TEXTURE_2D); 
fboH400.unbind(); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, fboH400.fboTexture); 

BlurVertex.enable(); 

verticalBlurFrag.enable(); 
glUniform1i(glGetUniformLocation(verticalBlurFrag.program, "RTBlurH"), 1); 

glDisable(GL_TEXTURE_2D); 

fboV400.bind(); 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushAttrib(GL_VIEWPORT_BIT); 
     glPushMatrix(); 
     glViewport(0, 0, width*4, height*4); //crude downscale 
      glBegin(GL_QUADS); 

      glColor3f(1.0f, 1.0f, 1.0f); 
      glTexCoord2f(0.0f, 1.0f); 
      glVertex3f(-1.0, 1.0, -1.0); 

      glTexCoord2f(1.0f, 1.0f); 
      glVertex3f(1.0, 1.0, -1.0); 

      glTexCoord2f(1.0f, 0.0f); 
      glVertex3f(1.0, -1.0, -1.0); 

      glTexCoord2f(0.0f, 0.0f); 
      glVertex3f(-1.0, -1.0, -1.0); 
     glEnd(); 
    glPopMatrix(); 
glPopAttrib(); 
glDisable(GL_TEXTURE_2D); 
fboV400.unbind(); 

glBindTexture(GL_TEXTURE_2D, 0); 

glEnable(GL_TEXTURE_2D); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, fboV800.fboTexture); 

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, fboV400.fboTexture); 

BlurVertex.enable(); 

blendTextures.enable(); 
glUniform1i(glGetUniformLocation(blendTextures.program, "originalSizeTex"), 0); 
glUniform1i(glGetUniformLocation(blendTextures.program, "downscaledTex"), 1); 

glDisable(GL_TEXTURE_2D); 

glBegin(GL_QUADS); 

    glColor3f(1.0f, 1.0f, 1.0f); 
    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 1.0f); 
    glVertex3f(-1.0, 1.0, -1.0); 

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 1.0f); 
    glVertex3f(1.0, 1.0, -1.0); 

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 0.0f); 
    glVertex3f(1.0, -1.0, -1.0); 

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 0.0f); 
    glVertex3f(-1.0, -1.0, -1.0); 
glEnd(); 

glDisable(GL_TEXTURE_2D);} 

OBF:

class FrameBufferObject{ 
public: 
    //handles 
    GLuint fbo, fboTexture, fboDepthbuffer; 
public: 
    void initialize(GLuint width, GLuint height){ 
     // generate namespace for the frame buffer, colorbuffer and depthbuffer 
     glGenFramebuffersEXT(1, &fbo); 
     glGenTextures(1, &fboTexture); 
     glGenRenderbuffersEXT(1, &fboDepthbuffer); 

     //switch to our fbo so we can bind stuff to it 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 

     //create the colorbuffer texture and attach it to the frame buffer 
     glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, fboTexture); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glGenerateMipmapEXT(GL_TEXTURE_2D); 

     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 
     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fboTexture, 0); 

     // create a render buffer as our depthbuffer and attach it 
     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fboDepthbuffer); 
     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24,width, height); 
     glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fboDepthbuffer); 

     // Go back to regular frame buffer rendering 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

     glDisable(GL_TEXTURE_2D); 
    } 

    void bind(){ 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
    } 
    void unbind(){ 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    } 

    void clear(){ 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    }}; 

ACTUALIZACIÓN:

El valor alfa uno del glClearColor al menos parece ser parte de mi problema.

He intentado jugar un poco con él y lo que tengo es esto: (con reducción de escala hacia arriba y quads, como cabría esperar)

enter image description here

De alguna manera me parece estar perdiendo todo el color en algún punto la manera. Curiosamente, obtuve el mejor resultado (0, 0, 0, 0) para 4 de mis FBO y (0, 0, 0, 1) para uno de ellos. El ajuste (0, 0, 0, 0) para todos los FBO solo produce una imagen grisácea (que supongo que es la ventana predeterminada sin nada en ella).

Aquí está mi "mezcla-juntos-shader":

uniform sampler2D originalSizeTex; 
uniform sampler2D downscaledTex; 

varying vec2 vTexCoord; 

void main(void){ 
    vec4 colorOriginal = vec4(0.0, 0.0, 0.0, 0.0); 
    vec4 colorDownscale = vec4(0.0, 0.0, 0.0, 0.0); 

    colorOriginal = texture2D(originalSizeTex, vTexCoord.xy); 
    colorDownscale = texture2D(downscaledTex, vTexCoord.xy); 

    gl_FragColor = vec4(colorOriginal + colorDownscale); 
} 

Alguna idea?

+0

Tuve este problema varias veces, y todas esas veces tenía que ver con cosas que no se dibujaban debido a la prueba de profundidad. Su última imagen sugiere que los rectángulos en el búfer z impiden que se dibujen las partes de los cuádriceps de pantalla completa. Sin embargo, no puedo encontrar un error con tu código. – Hannesh

Respuesta

1

Depende de cómo está haciendo su mezcla, pero - puede necesitar establecer el color claro en 0,0,0,0 en lugar de 0,0,0,1 cuando borre su FBO.

+0

gracias hasta ahora, eso definitivamente me puso un paso más cerca. – Oradon

Cuestiones relacionadas