我正在使用QOpenGLWidget并且在paintGL()方法中我将一个给定的纹理渲染到屏幕上。目前我只是加载图像并将它们渲染到屏幕上。一切都很好。
但现在我想做一个离屏渲染。我想渲染到帧缓冲区中进行一些计算并将这些计算存储到该帧缓冲区的纹理中。比我想渲染结果,所以该帧的纹理缓冲到屏幕上与现有的渲染调用。
目前我正在测试。因此,对帧缓冲区的渲染操作只是将孔屏幕着色为一种颜色:
/ * vertex shader * /
#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 :(得分:0)
好的我发现了问题.... 我用我的GLSL程序绑定了program.bind(),程序是典型的QOpenGLShaderProgram。
因为我的帧缓冲区只使用程序的程序ID而且我与glUseProgram(程序)绑定,它在某种程度上不会绑定程序。
我不知道为什么它没有用glUseProgram(_program)绑定新程序。但是现在我绑定了GLSL程序,为什么像其他着色器一样,现在它可以... 我现在很长时间坐在这个问题上:(