VTK 8.1.1 и Qt QML: двухуровневый пилинг не работает - PullRequest
0 голосов
/ 26 октября 2018

Приложение, над которым я работаю, основано на Qt QML, и я часто использую VTK через рендеринг vtkExternalOpenGLRenderWindow в QQuickFramebufferObject.Поскольку полупрозрачные геометрии не были правильно отображены, я узнал о двойной глубине отслаивания и включил ее, как рекомендовано на сайте ВТК:

https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderTranslucentGeometry

   _renderer = vtkSmartPointer<vtkRenderer>::New();
   _renderer->SetUseDepthPeeling( 1 );
   _renderer->SetMaximumNumberOfPeels( 100 );
   _renderer->SetOcclusionRatio( 0.1 );
   _renderWindow = vtkExternalOpenGLRenderWindow::New();
   _renderWindow->SetAlphaBitPlanes( 1 );
   _renderWindow->SetMultiSamples( 0 );
   _renderWindow->AddRenderer( _renderer );

К сожалению, все, что я могувидите сейчас красный фон.(Примечание: красный не цвет, который я использую для любых объектов или фонов)

Версии, которые я использую - VTK Версии 8.1.1 и Qt 5.11.2

Есть кто-нибудьпробовал что-то похожее с vtkExternalOpenGLRenderWindow, QQuickFramebufferObject и Dual Depth Peeling?Или идея, в чем может быть проблема.

1 Ответ

0 голосов
/ 21 ноября 2018

Не уверен, если у вас есть такая же проблема, но я также использую VTK через vtkExternalOpenGLRenderWindow рендеринг в QQuickFramebufferObject, и у меня были проблемы с прозрачностью.Я пытался включить поддержку глубинного пилинга, но это не сработало.Для меня это было все черное (не красное).В любом случае, я не включил глубинный пилинг и сделал следующее.

Вы, должно быть, создали класс Renderer, унаследованный от QQuickFramebufferObject::Renderer.Этот класс создает объект кадрового буфера.Обратите внимание, что по умолчанию FBO создается без каких-либо вложений, что означает, что тесты глубины и трафарета OpenGL не будут работать при рендеринге в объект кадрового буфера без каких-либо буферов глубины или трафарета (прозрачные объекты не будут отображаться правильно).Но вы можете настроить создание этого фрейм-буфера, переопределив createFramebufferObject:

QOpenGLFramebufferObject * createFramebufferObject( const QSize & p_size ) override
{
    // If the GL_EXT_packed_depth_stencil extension is present, a combined depth and stencil buffer is attached.
    // If the extension is not present, only a depth buffer is attached.
    QOpenGLFramebufferObjectFormat format;
    format.setAttachment( QOpenGLFramebufferObject::CombinedDepthStencil );
    return new QOpenGLFramebufferObject( p_size, format );
}

Это решило мои проблемы с прозрачностью.Надеюсь, это поможет.

...