Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 颜色挑选,QOpenGL&;后缓冲器_C++_Opengl_Qglwidget - Fatal编程技术网

C++ 颜色挑选,QOpenGL&;后缓冲器

C++ 颜色挑选,QOpenGL&;后缓冲器,c++,opengl,qglwidget,C++,Opengl,Qglwidget,使用QOpenGL内置工具实现一个简单的颜色拾取有一些神秘之处 上下文: 我有一个应用程序,拥有自己的OGL小部件。出于某些原因(多窗口小部件),我不得不通过QOpenGLWidget更改QGLWidget,这使我能够轻松地拥有许多OpenGL上下文,而不会(先验地)出现任何问题。这一变化实际上打破了我的色彩选择,我正在调查: 我之前这样做是为了得到我的目标: glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // render ever

使用QOpenGL内置工具实现一个简单的颜色拾取有一些神秘之处

上下文: 我有一个应用程序,拥有自己的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似乎无法在后帧缓冲区中读取。我怎么知道?我只是像以前一样通过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的吗?似乎用户无法真正选择正在发生的事情