2016-05-19 3 views
3

После обновления моей Qt 5.3.2 зависимости от Qt 5.6 рендеринг VTK больше не работает.VTK 7 & Qt5.6 Конфликт рендеринга OpenGL в OSX 10.11

Вот 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 на QOpenGLWidget для Qt 5.6:

QOpenGLWidget* l_gl_widget = new QOpenGLWidget; 

А теперь, мой QVTKWidget просто делает черное изображение (см конец почты). я уже вышел на this thread about making QVTKWidget inherits QOpenGLWidget, но я не могу позволить себе сделать это, из-за QOpenGLWidget & compositing

Я попытался создать подкласс QVTKWidget & некоторые из его методов (PaintEvent & сотрудничество.) Вручную управлять его рендеринг с использованием вещи, как vtkGenericOpenGLRenderWindow, но либо я сталкиваюсь с такими странными проблемами, которые я все еще пытаюсь решить, либо я недостаточно квалифицирован с ними.

В частности, при работе с QOpenGLContext & QSurfaceFormat, похоже, я не могу заставить их работать с OpenGL 3.2 (что требуется для поддержки VTK 7 OpenGL2). Кажется, что они застряли в версии 2.1.

Следует упомянуть, что у меня нет этой проблемы в Windows.

Если у вас есть подсказки или помощь, я с радостью соглашусь.

Последнее замечание: Эта проблема возникла после замены QWebKit на QWebEngine, которая используется в моем приложении, но никогда не отображается одновременно с представлением VTK. Тем не менее, как только я показываю QWebEngineView, все взгляды VTK моего приложения перестают работать.

Спасибо за ваше время :)

VTK Rendering problem

+0

Было бы очень интересно узнать, как ограничения влияют на VTK, кстати ... – peppe

+0

Спасибо, что указали, что я связывал неправильную часть документа. Я не хочу использовать QOpenGLWidget, потому что компоновка, похоже, вызывает проблемы и/или нарушает пользовательский интерфейс. Сообщение обновлено. – noKid

ответ

0

Руководство страница QOpenGLWidget говорит ...

«Примечание: Вызов QSurfaceFormat :: setDefaultFormat() перед созданием экземпляра класса QApplication является обязательным для некоторые платформы (например, macOS), когда запрашивается контекст профиля ядра OpenGL. Это делается для обеспечения того, чтобы совместное использование ресурсов между контекстами оставалось функциональным, поскольку все внутренние контексты создаются с использованием правильной версии и профиля ».

Возможно, это источник вашей проблемы?

И я понял, что одно отличие между QGLWidget и QOpenGLWidget заключается в том, что QGL ~ использует собственное окно в виджета, а QOpenGLWidget - нет. QOpenGLWidget всегда использует offscreen рендеринг. Я считаю, что это улучшит производительность renndering. Одним из недостатков для стороны VTK является то, что программа выйдет из строя, если вы попытаетесь что-то нарисовать (любой виджет vtk) на QOpenGLWidget (я имею в виду QVTKWidget? Наследующий QOpenGLWidget) до его инициализации.

Смежные вопросы