2011-04-25 87 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