2011-04-25 44 views
5

我已经达到另一个僵局,我似乎无法自行解决。我真的希望有人能帮助我。openGL/GLSL:开花/模糊,呈现给FBO

我一直在试图创建一个使用GLSL一个可爱的小绽放的效果,这相当奏效。当我试图将某些东西搬进我的场景中时,我注意到在渲染它们之前我忘了清除我的FBO。

没有清理它的工作,因为我总是使用相同的纹理从未改变场景。用glClear();命令它仍然有效,但是对于第一帧,我所得到的所有内容都是黑屏。所以我想我的问题是,我无法让我的FBO不断更新每一帧。

我觉得我既失去了一些东西很明显或做一些可怕的错误。

我很感谢你可能有任何建议。

这是我得到的第一帧: enter image description here

来源: (使用了openFrameworks)

设置:

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);} 

抽奖:

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);} 

FBO:

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); 
    }}; 

UPDATE:

的Alpha值之一glClearColor至少似乎是我的问题的一部分。

我试图搞乱与它周围和我得到的是这样的: (带箭头和缩减正如你所期望的四边形)

enter image description here

不知怎的,我似乎是沿着某处失去了所有的颜色方式。 奇怪的是,我得到了4个FBO和(0,0,0,1)其中一个的最佳结果(0,0,0,0)。为所有FBO设置(0,0,0,0)只会产生一个灰色图片(我假设它是没有任何内容的默认窗口)。

这里是我的 “混合在一起的着色器”:

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); 
} 

任何的猜测?

+0

我有这个问题了几次,和所有那些时候,它是与由于深度测试的东西不拉丝做的。您的最后一张图像表明z缓冲区中的矩形阻止了全屏四边形的部分绘制。但是,我无法找到您的代码的错误。 – Hannesh 2011-04-25 21:08:55

回答

1

取决于你怎么做你的混合,但是 - 你可能需要设置明确的颜色为0,0,0,0,而不是0,0,0,1,当你明确你的FBO。

+0

感谢迄今,这绝对让我更靠近一步。 – Oradon 2011-04-25 18:03:38