C++ 颜色挑选,QOpenGL&;后缓冲器
使用QOpenGL内置工具实现一个简单的颜色拾取有一些神秘之处 上下文: 我有一个应用程序,拥有自己的OGL小部件。出于某些原因(多窗口小部件),我不得不通过QOpenGLWidget更改QGLWidget,这使我能够轻松地拥有许多OpenGL上下文,而不会(先验地)出现任何问题。这一变化实际上打破了我的色彩选择,我正在调查: 我之前这样做是为了得到我的目标:C++ 颜色挑选,QOpenGL&;后缓冲器,c++,opengl,qglwidget,C++,Opengl,Qglwidget,使用QOpenGL内置工具实现一个简单的颜色拾取有一些神秘之处 上下文: 我有一个应用程序,拥有自己的OGL小部件。出于某些原因(多窗口小部件),我不得不通过QOpenGLWidget更改QGLWidget,这使我能够轻松地拥有许多OpenGL上下文,而不会(先验地)出现任何问题。这一变化实际上打破了我的色彩选择,我正在调查: 我之前这样做是为了得到我的目标: glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // render ever
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似乎无法在后帧缓冲区中读取。我怎么知道?我只是像以前一样通过glReadPixels显示了整个假定的缓冲区读取,它给了我一个应用程序的部分屏幕截图,但不是我的QOPenGLWidget:O,这意味着现在,根据QGLWidget或QOPenGLWidget,glReadPixels具有不同的行为
很好。永不放弃强>
我尝试通过QOpenGLWidget::grabFrameBuffer()获取帧缓冲区;
它创建了一个。。。我不知道缓冲区是什么
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的吗?似乎用户无法真正选择正在发生的事情