2016-05-19 4 views
3

Qt 5.3.2への依存性をQt 5.6にアップグレードした後、VTKレンダリングはもはや機能しません。VTK 7&Qt5.6 OSX 10.11でのOpenGLレンダリングの競合

#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(); 
} 

私は単純にはQt 5.6のためQOpenGLWidgetにQGLWidgetを更新:ここで

は5.3.2コードです

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ビューと同時に表示されないQWebEngineで置き換えた後に表示されます)。しかし、私がQWebEngineViewを表示するとすぐに、私のアプリのすべてのVTKビューが機能しなくなります。お時間を

感謝:)

VTK Rendering problem

+0

制限がどのようにVTKに影響を与えているのかを知ることは非常に面白いです。 – peppe

+0

私はドキュメントの間違った部分をリンクしていたことを指摘してくれてありがとうございます。私は、QOpenGLWidgetを使用したくないのです。なぜなら、合成は問題を引き起こしているようだし、UIを混乱させるからです。投稿が更新されました。 – noKid

答えて

0

QOpenGLWidgetのマニュアルページは、注記」...

を言う:QSurfaceFormatを呼び出す:: setDefaultFormat()はQApplicationのインスタンスを作成する前には、上の義務でありますOpenGLコアプロファイルコンテキストが要求されたときに、いくつかのプラットフォーム(例えば、macOS)が必要です。これは、正しいバージョンとプロファイルを使用してすべての内部コンテキストが作成されるため、コンテキスト間のリソース共有が機能し続けるようにするためです。

これは問題の原因になりますか?

QGLWidgetとQOpenGLWidgetの違いは、QGL〜がウィジェットのネイティブウィンドウを使用するということです.QOpenGLWidgetはそうではありません。 QOpenGLWidgetは常にオフスクリーンレンダリングを使用します。レンダリングのパフォーマンスが向上すると思います。 VTK側の欠点の1つは、初期化する前に何か(任意のvtkウィジェット)をQOpenGLWidget(私はQVTKWidget?QOpenGLWidgetを継承しています)に描画しようとすると、プログラムがクラッシュすることです。

関連する問題