【发布时间】:2017-03-02 17:40:16
【问题描述】:
我正在使用 QOpenGLWidget 并在 paintGL() 方法中将给定的纹理渲染到屏幕上。目前我只是加载图像并将它们渲染到屏幕上。一切都很好。
但现在我想做一个离屏渲染。我想渲染到帧缓冲区中进行一些计算并将这些计算存储到该帧缓冲区的纹理中。比我想渲染结果,所以该帧缓冲区的纹理使用现有的渲染调用显示在屏幕上。
目前我只是在测试。所以对帧缓冲区的渲染操作只是用一种颜色为孔屏着色:
/* 顶点着色器 */
#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 个顶点。
我的结果是,一个三角形是蓝色的,我正在清除帧缓冲区的颜色,另一个三角形是黑色,我正在渲染的那个。但是这个三角形应该是红色的。
我通常在使用成名缓冲区时没有问题,而且我经常退出使用它们。但这是我第一次使用 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);
【问题讨论】: