VTK 8.1.1和Qt QML:双深度剥离功能不起作用

时间:2018-10-26 09:53:40

标签: c++ qt qml vtk

我正在使用的应用程序基于Qt QML,我经常通过vtkExternalOpenGLRenderWindow渲染到QQuickFramebufferObject使用VTK。由于无法正确呈现半透明的几何图形,因此我发现了双重深度剥离并按照VTK网站上的建议启用了它:

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 :(得分:0)

不知道您是否遇到相同的问题,但是我也正在通过vtkExternalOpenGLRenderWindow渲染到QQuickFramebufferObject使用VTK,而我在透明度方面遇到了问题。我也尝试启用深度去皮支持,但是没有用。对我来说,全是黑色(不是红色)。无论如何,我最终没有启用深度剥离,而是执行了以下操作。

您必须已经创建了一个继承自QQuickFramebufferObject::Renderer的类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 );
}

这样做可以解决我的透明度问题。希望这会有所帮助。