Qt3D:使用Qt3DRender :: QLayerFilter [英] Qt3D: using Qt3DRender::QLayerFilter
本文介绍了Qt3D:使用Qt3DRender :: QLayerFilter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用图层过滤,如此答案所示.为此,我编写了一个简单的测试(请参见下文). 如果我将代码从My3DWindow类传输到main.cpp,则此代码有效. My3DWindow类中的错误在哪里?可以在此处查看完整的测试项目.
I am trying to use layer filtering as shown in this answer. For this I wrote a simple test (see below). if I transfer code from a My3DWindow class to a main.cpp - this code is worked. Where is the error in My3DWindow class? The full test project can be viewed here.
main.cpp
int main(int argc, char *argv[])
{
QGuiApplication application(argc, argv);
auto window = new My3DWindow;
auto sphere1 = new Qt3DCore::QEntity(window->Scene());
auto sphere2 = new Qt3DCore::QEntity(window->Scene());
auto transform1 = new Qt3DCore::QTransform;
transform1->setTranslation(QVector3D(0.0f, 0.0f, -10.0f));
auto transform2 = new Qt3DCore::QTransform;
transform2->setTranslation(QVector3D(-10.0f, 0.0f, 0.0f));
auto material1 = new Qt3DExtras::QPhongMaterial;
material1->setAmbient(Qt::blue);
auto material2 = new Qt3DExtras::QPhongAlphaMaterial;
material2->setAmbient(Qt::red);
auto spheremesh = new Qt3DExtras::QSphereMesh;
spheremesh->setRadius(15.0);
spheremesh->setSlices(32);
spheremesh->setRings(32);
sphere1->addComponent(transform1);
sphere1->addComponent(material1);
sphere1->addComponent(spheremesh);
sphere1->addComponent(window->OpaqueLayer());
sphere2->addComponent(transform2);
sphere2->addComponent(material2);
sphere2->addComponent(spheremesh);
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));
auto cameraController = new Qt3DExtras::QFirstPersonCameraController(m_Scene);
cameraController->setCamera(m_Camera);
m_TransparentLayer = new Qt3DRender::QLayer;
auto transparentFilter = new Qt3DRender::QLayerFilter(m_Camera);
transparentFilter->addLayer(m_TransparentLayer);
m_OpaqueLayer = new Qt3DRender::QLayer;
auto opaqueFilter = new Qt3DRender::QLayerFilter(m_Camera);
opaqueFilter->addLayer(m_OpaqueLayer);
setActiveFrameGraph(renderSurfaceSelector);
}
推荐答案
下面给出了有关主要问题的正确代码.剩下的问题在此处中进行描述.
The correct code on the main issue is given below. The remaining problem is described here.
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, m_TransparentLayer
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);
}
main.cpp:
My3DWindow window;
代替
auto window = new My3DWindow;
这篇关于Qt3D:使用Qt3DRender :: QLayerFilter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文