Unsolved Qt3D: Artifacts of displaying when applied Qt3DRender::QLayerFilter
-
I am trying to use layer filtering using Qt3DRender::QLayerFilter.
For this I wrote a simple test (see below). The full test project can be viewed here.
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).
See screen:
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?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 class:
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. I don't fully understand why it's the right thing to do:
auto clearBuffers = new Qt3DRender::QClearBuffers(cameraSelector);
insted
auto clearBuffers = new Qt3DRender::QClearBuffers(renderSurfaceSelector);