我正在使用的应用程序基于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尝试过类似的东西吗?或一个想法可能是什么问题。
答案 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 );
}
这样做可以解决我的透明度问题。希望这会有所帮助。