我使用的是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);