【发布时间】:2018-11-29 07:35:16
【问题描述】:
我想向 QOpenGLWidget 的默认帧缓冲区添加第二个渲染目标。
原因是我想实现对象拾取并通过将分割掩码渲染到gl_FragData[1] 来检查用户是否击中了对象。不幸的是,您只能从小部件中检索GLuint 句柄,并且没有QOpenGLFramebufferObject 的构造函数接收该句柄,并且没有其他选项可以检索帧缓冲区。
是否有可能在没有变通方法的情况下将另一个纹理附加到小部件的默认帧缓冲区?
我能想到的只有两个选项:
1.
在初始化时使用原生 OpenGL 调用(我宁愿坚持纯 Qt)附加纹理(当然我会存储 segmentationTexture 以便以后删除它):
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());
QOpenGLTexture *segmentationTexture = new QOpenGLTexture(QOpenGLTexture::BindingTargetBuffer);
// set texture parameters
segmentationTexture.create();
segmentationTexture.bind();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, segmentationTexture.textureId(), 0);
segmentationTexture.release();
然后在paintGL()
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, buffers);
在 OpenGL 绘制调用之前并使用 glReadBuffer(GL_COLOR_ATTACHMENT1); 从 gl_FragData[1] 检索内容。或者,如果这不起作用,则仅使用本机 OpenGL 代码来生成纹理。
2.
创建第二个帧缓冲区对象,将其绑定到paintGL(),然后使用glBlitFramebuffer(以考虑多重采样)将内容与默认帧缓冲区交换以显示渲染,但使用第二个帧缓冲区从gl_FragData[1] 读取。但这感觉有点“讨厌”。
【问题讨论】:
标签: qt opengl framebuffer rendertarget