【问题标题】:QT offscreen rendering stays blackQT 离屏渲染保持黑色
【发布时间】: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);

【问题讨论】:

    标签: c++ qt opengl


    【解决方案1】:

    好的,我发现了问题.... 我正在用 program.bind() 绑定我的 GLSL 程序,程序是典型的 QOpenGLShaderProgram。

    因为对于我的帧缓冲区,我只使用程序的程序 ID,并且我正在与 glUseProgram(program) 绑定,所以它在某种程度上没有绑定程序。

    我不知道为什么它没有用 glUseProgram(_program) 绑定新程序。但是现在我正在绑定 GLSL 程序,为什么像其他着色器一样,现在它可以工作了...... 我现在在这个问题上坐了很长时间:(

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2011-04-20
      • 1970-01-01
      • 2019-01-01
      相关资源
      最近更新 更多