Details
-
Bug
-
Resolution: Unresolved
-
P2: Important
-
None
-
5.14.0, 5.14.1, 5.14.2, 5.15.0 Beta3, 5.15.0
-
None
Description
Using a split RenderTree for transparentLayer and opaqueLayer. When using the SceneLoader to load object into the scene it seems that there are some graphics draw so that a black silhouette of the object appear in front of the scene.
In the picture the silhouette of the robot is shown from the robot loaded inn front of the transparent cone.
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); createSceen(); setWindowTitle("Load scene transparent"); }MainWindow::~MainWindow() { delete ui; } void MainWindow::createSceen() { // Create a view and attach to widget m_view = new Qt3DExtras::Qt3DWindow(); QWidget *viewContainer = QWidget::createWindowContainer(m_view); setCentralWidget(viewContainer); // The root entity for the new sceen m_rootEntity = new Qt3DCore::QEntity(); // Create a splitt rendertree m_transparentLayer = new Qt3DRender::QLayer; m_opaqueLayer = new Qt3DRender::QLayer; Qt3DRender::QRenderSurfaceSelector *renderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector(); renderSurfaceSelector->setSurface(m_view); Qt3DRender::QClearBuffers *clearBuffers = new Qt3DRender::QClearBuffers(renderSurfaceSelector); clearBuffers->setBuffers(Qt3DRender::QClearBuffers::AllBuffers); clearBuffers->setClearColor(Qt::white); Qt3DRender::QViewport *viewport = new Qt3DRender::QViewport(renderSurfaceSelector); Qt3DRender::QCameraSelector *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(-20.0f, 20.0f, 0.0f)); m_camera->setUpVector(QVector3D(0,1,0)); m_camera->setViewCenter(QVector3D(0, 0, 0)); cameraSelector->setCamera(m_camera); // not entirely sure why transparent filter has to go first // I would have expected the reversed order of the filters but this works... Qt3DRender::QLayerFilter *transparentFilter = new Qt3DRender::QLayerFilter(m_camera); transparentFilter->addLayer(m_transparentLayer); Qt3DRender::QLayerFilter *opaqueFilter = new Qt3DRender::QLayerFilter(m_camera); opaqueFilter->addLayer(m_opaqueLayer); m_view->setActiveFrameGraph(renderSurfaceSelector); m_opaqueLayer->setRecursive(true); m_transparentLayer->setRecursive(true); m_view->setRootEntity(m_rootEntity); Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(m_rootEntity); camController->setLinearSpeed( 50.0f ); camController->setLookSpeed( 180.0f ); camController->setCamera(m_camera); // Create a few basic geometries that works... // Create a Cone Shape Qt3DExtras::QConeMesh *cone = new Qt3DExtras::QConeMesh(); cone->setTopRadius(0.5); cone->setBottomRadius(1); cone->setLength(3); cone->setRings(50); cone->setSlices(20); // ConeMesh Transform Qt3DCore::QTransform *coneTransform = new Qt3DCore::QTransform(); coneTransform->setScale(1.5f); coneTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1.0f, 0.0f, 0.0f), 45.0f)); coneTransform->setTranslation(QVector3D(0.0f, 4.0f, -1.5)); // Cone material Qt3DExtras::QPhongMaterial *coneMaterial = new Qt3DExtras::QPhongMaterial(); coneMaterial->setDiffuse(QColor(QRgb(0x928327))); // Cone Qt3DCore::QEntity * coneEntity = new Qt3DCore::QEntity(m_rootEntity); coneEntity->addComponent(cone); coneEntity->addComponent(coneMaterial); coneEntity->addComponent(coneTransform); coneEntity->addComponent(m_opaqueLayer); // Create a Cylinder shape Qt3DExtras::QCylinderMesh *cylinder = new Qt3DExtras::QCylinderMesh(); cylinder->setRadius(1); cylinder->setLength(3); cylinder->setRings(100); cylinder->setSlices(20); // CylinderMesh Transform Qt3DCore::QTransform *cylinderTransform = new Qt3DCore::QTransform(); cylinderTransform->setScale(1.5f); cylinderTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1.0f, 0.0f, 0.0f), 45.0f)); cylinderTransform->setTranslation(QVector3D(-5.0f, 4.0f, -1.5)); // Cylinder material Qt3DExtras::QPhongAlphaMaterial *cylinderMaterial = new Qt3DExtras::QPhongAlphaMaterial(); cylinderMaterial->setDiffuse(QColor(QRgb(0x928327))); cylinderMaterial->setAlpha(0.5f); // Cylinder Qt3DCore::QEntity * cylinderEntity = new Qt3DCore::QEntity(m_rootEntity); cylinderEntity->addComponent(cylinder); cylinderEntity->addComponent(cylinderMaterial); cylinderEntity->addComponent(cylinderTransform); cylinderEntity->addComponent(m_transparentLayer); // Now create a object using the scene loader... // NOT WORKING? This cause an black area to be displayed inn front of the scene :( Qt3DCore::QEntity * objectEntity = loadFromFile(QUrl("qrc:/models/object-1.qgltf")); objectEntity->addComponent(m_transparentLayer); }Qt3DCore::QEntity *MainWindow::loadFromFile(const QUrl & url) { qDebug() << "Load from file: " << url; Qt3DCore::QEntity *sceneLoaderEntity = new Qt3DCore::QEntity(m_rootEntity); Qt3DRender::QSceneLoader *sceneLoader = new Qt3DRender::QSceneLoader(sceneLoaderEntity); sceneLoaderEntity->addComponent(sceneLoader); sceneLoader->setSource(url); return sceneLoaderEntity; }