我想将第二个渲染目标添加到 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]
. 但这感觉有点“讨厌”。