2017-03-02 89 views
0

我使用的是QOpenGLWidget並在paintGL()方法,我呈現給定的紋理到屏幕上。目前我只是加載圖像並將其渲染到屏幕上。一切都很好。QT離屏渲染保持黑色

但現在我想做一個離屏渲染。我想渲染到一個幀緩衝區來做一些計算並將這些計算存儲到幀緩衝區的紋理中。比我想渲染結果,所以幀緩衝區的紋理與現有的渲染調用到屏幕上。

目前我只是測試。所以渲染操作到幀緩衝器只是着色孔屏幕一種顏色:

/*頂點着色器*/

#version 330 

layout (location = 0) in vec3 a_position; 

void main(void) 
{ 
    gl_Position = vec4(a_position, 1.0); 
} 

/*片段着色器*/

#version 330 
out vec3 fragColor; 

void main(void) 
{ 
    fragColor = vec3(1.0,0.0,0.0); 
} 

渲染電話也很直接:

/*致電電話*/

glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
glClearColor(0.0,0.0,1.0,1.0); 
glClear(GL_COLOR_BUFFER_BIT); 

glBindVertexArray(_vao); 

glUseProgram(_program); 

glDrawArrays(GL_TRIANGLES, 0, 3); 

VAO只是一個簡單的正方形,和我用於渲染屏幕一樣。正如我們所看到的,我不是渲染整個正方形,因爲我只渲染了3個頂點。

我的結果是,這是一個三角形是藍色的,我清理與幀緩衝區和其他三角形的顏色是黑色的,一個我渲染。但是這個三角形應該是紅色的。

我通常沒有使用famebuffer,我使用他們常不幹的問題。但這是我第一次與QT合作,我的猜測是,在使用QT和幀緩衝區時有不同的工作方式,但我找不到解決方案。

我也加入了幀緩衝區的建立:

glGenFramebuffers(1, &fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _frameSize, _frameSize, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 

    //Error check 


GLenum error = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
     if (error == GL_FRAMEBUFFER_COMPLETE) { 
      std::cout << "FBO successfully loadet" << std::endl; 
     }else{ 
      std::cout << "FBO had en ERROR !!!!!!!!!!!!!!!" << std::endl; 
     } 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

回答

0

好吧,我發現這個問題.... 我結合我GLSL程序與program.bind()和程序是典型QOpenGLShaderProgram的。

而且因爲我的框架使用的程序,只有程序ID緩衝一上午,我與glUseProgram(程序)結合它在某種程度上不是不具約束力的程序。

我不知道爲什麼它沒有邊界與glUseProgram(_program)的新方案。但現在我綁定的GLSL程序相同,爲什麼像其他着色器,現在,它的作品... 我現在坐時間長了就這個問題:(