OSX 10.11 上的 VTK 7 和 Qt5.6 OpenGL 渲染冲突

Posted

技术标签:

【中文标题】OSX 10.11 上的 VTK 7 和 Qt5.6 OpenGL 渲染冲突【英文标题】:VTK 7 & Qt5.6 OpenGL Rendering conflict on OSX 10.11 【发布时间】:2016-05-19 17:12:07 【问题描述】:

将我的 Qt 5.3.2 依赖项升级到 Qt 5.6 后,VTK 渲染不再起作用。

这是 5.3.2 代码:

#include <QtWidgets>
#include <QGLWidget>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <QVTKWidget.h>
#include <vtkRenderWindow.h>

int main( int argc, char** argv )

    // create QApplication
    QApplication l_app( argc, argv );

    // Create widget and layout
    QWidget* l_main_widget = new QWidget;
    QHBoxLayout* l_main_layout = new QHBoxLayout;
    l_main_widget->setLayout( l_main_layout );

    // create a QVtkWidget with a simple sphere inside
    QVTKWidget* l_view = new QVTKWidget;
    l_view->setFixedSize( 300, 300 );
    vtkSmartPointer<vtkSphereSource> l_sphere_source = vtkSmartPointer<vtkSphereSource>::New();
    vtkSmartPointer<vtkPolyDataMapper> l_sphere_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    l_sphere_mapper->SetInputConnection( l_sphere_source->GetOutputPort() );
    vtkSmartPointer<vtkActor> l_sphere_actor = vtkSmartPointer<vtkActor>::New();
    l_sphere_actor->SetMapper( l_sphere_mapper );
    vtkSmartPointer<vtkRenderer> l_renderer = vtkSmartPointer<vtkRenderer>::New();
    l_renderer->AddActor( l_sphere_actor );
    l_view->GetRenderWindow()->AddRenderer( l_renderer );
    l_main_layout->addWidget( l_view );

    // create a QWebEngineView
    QGLWidget* l_gl_widget = new QGLWidget;
    l_main_layout->addWidget(l_gl_widget);
    l_main_widget->show();

    return l_app.exec();

我只是将 QGLWidget 更新为 Qt 5.6 的 QOpenGLWidget :

QOpenGLWidget* l_gl_widget = new QOpenGLWidget;

现在,我的 QVTKWidget 只是呈现黑色图像(见帖子末尾)。 我已经踩到了this thread about making QVTKWidget inherits QOpenGLWidget,但是我买不起,因为QOpenGLWidget & compositing

我尝试将 QVTKWidget 及其一些方法(PaintEvent & co.)子类化,以使用 vtkGenericOpenGLRenderWindow 之类的东西手动管理其渲染,但要么我遇到了我仍在尝试解决的奇怪问题,要么我对这些还不够熟练。

特别是在处理 QOpenGLContext 和 QSurfaceFormat 时,我似乎无法让它们与 OpenGL 3.2 一起工作(这是 VTK 7 OpenGL2 后端所要求的)。他们似乎被 2.1 版本卡住了。

我应该提到我在 Windows 上没有这个问题。

如果你有一些线索或帮助提供,我很乐意接受。

最后一句话:这个问题是在用我的应用中使用的QWebEngine替换QWebKit后出现的,但从来没有与VTK视图同时显示。然而,当我显示 QWebEngineView 时,我的应用程序的所有 VTK 视图都停止工作。

感谢您的宝贵时间:)

【问题讨论】:

顺便说一下,了解这些限制是如何影响 VTK 的会非常有趣... 感谢您指出我链接了文档的错误部分。我不想使用 QOpenGLWidget 因为合成似乎会导致问题和/或混乱 UI。帖子已更新。 【参考方案1】:

QOpenGLWidget 的手册页说...

"注意:在某些平台(例如,macOS)上,当请求 OpenGL 核心配置文件上下文时,在构造 QApplication 实例之前调用 QSurfaceFormat::setDefaultFormat() 是强制性的。这是为了确保上下文之间的资源共享保持功能所有内部上下文都是使用正确的版本和配置文件创建的。”

这可能是您问题的根源吗?

我意识到 QGLWidget 和 QOpenGLWidget 之间的一个区别是 QGL~ 在小部件中使用本机窗口,而 QOpenGLWidget 不是。 QOpenGLWidget 总是使用离屏渲染。我相信它会增强渲染性能。 VTK 方面的一个缺点是,如果您在初始化之前尝试在 QOpenGLWidget(我的意思是 QVTKWidget?继承 QOpenGLWidget)上绘制某些东西(任何 vtk 小部件),程序将会崩溃。

【讨论】:

以上是关于OSX 10.11 上的 VTK 7 和 Qt5.6 OpenGL 渲染冲突的主要内容,如果未能解决你的问题,请参考以下文章

OSX 10.6 上的 Qt5

OS X 10.11 上的 PDFtk 服务器

Mac Os 10.11 上没有名为 QtMultimedia 的模块

使用图形函数时出现分段错误(vtk 6.1、Qt5.3、Ubuntu)

VS2019编译VTK-9.1.0+Qt5.15.2

mac mysql 安装