有一些谜团,使用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()中渲染的图像不同(我使用特定的'拾取着色器渲染...
希望你能跟上一切。总结一下: