颜色选择,QOpenGL&后缓冲区

时间:2017-02-23 15:40:33

标签: c++ opengl qglwidget

有一些谜团,使用QOpenGL内置工具实现简单的colorPicking。

上下文: 我是一个应用程序,拥有自己的OGL小部件。由于某些原因(多小部件),我不得不通过QOpenGLWidget更改我的QGLWidget,这使我可以轻松地拥有许多OpenGL上下文而不会(先验)任何问题。这个改变实际上打破了我的颜色挑选,然后我调查了:

我之前这样做是为了得到我的对象:

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);


// render every object in our scene
ShaderLib::bindShader(ShaderLib::PICKING_SHADER);
{
    for(auto const& _3dobject : model_->getObjects())
        _3dobject.second->draw(projection_, cameraview_, true);
}
ShaderLib::unbind();

glFlush();
glFinish();

// get color information from frame buffer
float pixel[4];
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);

glReadPixels(event->x(), viewport[3] - event->y(), 1, 1, GL_RGBA,  GL_FLOAT, pixel)

这完全适用于QGLWidget。我可以得到像素,然后匹配对象。我将我的像素保存在QImage中以确认,我完全符合预期。

通过QOpenGLWidget更改QGLWidget后:

然后,使用QOpenGLWidget,上面的代码不起作用。最糟糕的是:glReadPixels似乎没有在后面的framebuffer中读取。我怎么知道 ?我只是像以前一样通过glReadPixels显示整个假设的缓冲区读取,它给了我应用程序的部分截图,但不是我的QOPenGLWidget:O,这意味着现在,glReadPixels根据QGLWidget或QOpenGLWidget有不同的行为!

好。永不放弃!

我尝试通过QOpenGLWidget :: grabFrameBuffer()获取帧缓冲区; 它创建了一个QImage ......我不知道缓冲区是什么。

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);


// render every object in our scene
ShaderLib::bindShader(ShaderLib::PICKING_SHADER);
{
    for(auto const& _3dobject : model_->getObjects())
        _3dobject.second->draw(projection_, cameraview_, true);
}
ShaderLib::unbind();

glFlush();
glFinish();

QImage fb = grabFramebuffer();

这会打印出我在paintGL()函数中绘制的帧缓冲区的图像,这与我在MousePressEvent()中渲染的图像不同(我使用特定的'拾取着色器渲染...

希望你能跟上一切。总结一下:

  • 有谁理解为什么glReadPixels会在两位画家之间给出不同的结果。用过的 ?我当然错过了一些东西
  • 有没有人得到双缓冲如何使用QOpenGLWidget?用户似乎无法真正选择正在发生的事情。

0 个答案:

没有答案