将QMultiSampleAntiAliasing添加到QForwardRenderer

时间:2018-07-13 18:54:04

标签: c++ qt qt5 qt3d

我正在尝试在qt3d中启用多重采样。 Qt3DExtras :: Qt3DWindow在初始化过程中已经执行了以下操作:

format.setDepthBufferSize(24);
format.setSamples(4);
format.setStencilBufferSize(8);
setFormat(format);
QSurfaceFormat::setDefaultFormat(format);

这是一个好的开始。因此,根据this post,启用多重采样所需的唯一OpenGL调用将是

glEnable(GL_MULTISAMPLE);

事实上,documentation of QMultiSampleAntiAliasing的文档指出:

  

注意:使用OpenGL作为图形API时,如果QMultiSampleAntiAliasing已添加到渲染状态,则会调用glEnable(GL_MULTISAMPLE)。

因此,要将QMultiSampleAntiAliasing添加到框架图中,我想到了以下内容:

//For antialiasing
Qt3DRender::QRenderStateSet *multiSampleRenderStateSet = new Qt3DRender::QRenderStateSet;
Qt3DRender::QMultiSampleAntiAliasing *msaa = new Qt3DRender::QMultiSampleAntiAliasing;
multiSampleRenderStateSet->addRenderState(msaa);
this->activeFrameGraph()->setParent(multiSampleRenderStateSet);
this->setActiveFrameGraph(multiSampleRenderStateSet);

但是很明显,由于这会全局覆盖所有默认的RenderState,因此它给我带来了相当混乱的渲染。而且我甚至不确定多采样功能是否已启用(或者之前是否已经启用过?)。

所以基本上,我的问题是:

将QRenderState添加到默认QForwardRenderer框架图的最简单方法是什么?尤其是QMultiSampleAntiAliasing?

1 个答案:

答案 0 :(得分:1)

好的,因此,在阅读this电子邮件线程之后,我现在使用以下几行:

//For antialiasing
Qt3DRender::QRenderStateSet *renderStateSet = new Qt3DRender::QRenderStateSet;

Qt3DRender::QMultiSampleAntiAliasing *msaa = new Qt3DRender::QMultiSampleAntiAliasing;
renderStateSet->addRenderState(msaa);
Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest;
depthTest->setDepthFunction(Qt3DRender::QDepthTest::LessOrEqual);
renderStateSet->addRenderState(depthTest);

this->activeFrameGraph()->setParent(renderStateSet);
this->setActiveFrameGraph(renderStateSet);

这显然恢复了Qt3D的默认DepthTest,并给了我看似干净的渲染。