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

时间:2016-05-19 17:12:08

标签: c++ macos qt opengl vtk

将我的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&amp;它的一些方法(PaintEvent&amp; co。)使用像vtkGenericOpenGLRenderWindow这样的东西来手动管理它的渲染,但是我要面对我仍在努力解决的奇怪问题,或者我对这些问题不够熟练。

特别是在处理QOpenGLContext&amp; QSurfaceFormat,似乎我不能让他们使用OpenGL 3.2(VTK 7 OpenGL2后端需要)。他们似乎陷入2.1版本。

我应该提一下,我在Windows上没有这个问题。

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

最后评论:在我的应用程序中使用的QWebEngine替换QWebKit后出现此问题,但从未与VTK视图同时显示。然而,只要我显示QWebEngineView,我的应用程序的所有VTK视图就会停止工作。

感谢您的时间:)

VTK Rendering problem

1 个答案:

答案 0 :(得分:0)

QOpenGLWidget的手册页说......

&#34;注意:在请求OpenGL核心配置文件上下文时,在构造QApplication实例之前调用QSurfaceFormat :: setDefaultFormat()在某些平台(例如,macOS)上是必需的。这是为了确保上下文之间的资源共享保持正常,因为所有内部上下文都是使用正确的版本和配置文件创建的。&#34;

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

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