Qt3d:应用Qt3DRender :: QLayerFilter时显示的工件 [英] Qt3d: Artifacts of displaying when applied Qt3DRender::QLayerFilter
问题描述
我正在尝试使用图层过滤,如此答案所示.为此,我编写了一个简单的测试(请参见下文).这是问题的延续.
I am trying to use layer filtering as shown in this answer. For this I wrote a simple test (see below). This is a continuation of the question.
在红色球体的某个位置会出现一个伪像,看起来像是从另一台摄像机以坐标(0.0,0.0,0.0)进行显示.
At a certain position of the red sphere, an artifact appears, which looks like display from the another camera in coordinates (0.0, 0.0, 0.0).
查看屏幕:
在我的示例中,可以使用WSAD按钮移动红色球体. 请参阅(-7、0,-14)红色球体位置.如何清除这些文物? 可以在此处查看完整的测试项目.
In my example, the red sphere can be moved with the WSAD buttons. See (-7, 0, -14) red sphere position. How to remove these artifacts? The full test project can be viewed here.
main.cpp
int main(int argc, char *argv[])
{
QGuiApplication application(argc, argv);
My3DWindow window;
auto sphere1 = new Qt3DCore::QEntity(window.Scene());
auto sphere2 = new Qt3DCore::QEntity(window.Scene());
// material, transform, mesh initialisation
sphere1->addComponent(material1);
sphere1->addComponent(spheremesh1);
sphere1->addComponent(transform1);
sphere1->addComponent(window.OpaqueLayer());
sphere2->addComponent(material2);
sphere2->addComponent(spheremesh2);
sphere2->addComponent(transform2);
sphere2->addComponent(window.TransparentLayer());
window.show();
return application.exec();
}
My3DWindow类:
My3DWindow::My3DWindow(QScreen *screen):
Qt3DExtras::Qt3DWindow(screen)
{
m_Scene = new Qt3DCore::QEntity;
setRootEntity(m_Scene);
auto renderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector(m_Scene);
renderSurfaceSelector->setSurface(this);
auto clearBuffers = new Qt3DRender::QClearBuffers(renderSurfaceSelector);
clearBuffers->setBuffers(Qt3DRender::QClearBuffers::AllBuffers);
clearBuffers->setClearColor(Qt::gray);
auto viewport = new Qt3DRender::QViewport(renderSurfaceSelector);
auto cameraSelector = new Qt3DRender::QCameraSelector(viewport);
m_Camera = new Qt3DRender::QCamera(cameraSelector);
m_Camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
m_Camera->setPosition(QVector3D(0.0f, 0.0f, 100.0f));
m_Camera->setViewCenter(QVector3D(0.0f, 0.0f, 0.0f));
cameraSelector->setCamera(m_Camera);
auto cameraController = new Qt3DExtras::QFirstPersonCameraController(m_Scene);
cameraController->setCamera(m_Camera);
m_OpaqueLayer = new Qt3DRender::QLayer;
auto opaqueFilter = new Qt3DRender::QLayerFilter(m_Camera);
opaqueFilter->addLayer(m_OpaqueLayer);
m_TransparentLayer = new Qt3DRender::QLayer;
auto transparentFilter = new Qt3DRender::QLayerFilter(m_Camera);
transparentFilter->addLayer(m_TransparentLayer);
setActiveFrameGraph(renderSurfaceSelector);
}
推荐答案
已修复.在原始示例中,发现错误.我不完全理解为什么这样做是正确的:
Fixed. In the original example, an error found. I don't fully understand why it's the right thing to do:
auto clearBuffers = new Qt3DRender::QClearBuffers(cameraSelector);
插入
auto clearBuffers = new Qt3DRender::QClearBuffers(renderSurfaceSelector);
这篇关于Qt3d:应用Qt3DRender :: QLayerFilter时显示的工件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!