ylw123 |
2018-03-16 06:16 |
QML进行Qt3D场景绘制正常,但使用C++却不行
用QML绘制一个Qt3D场景,使其背景为渐变色,效果如下,一切正常 [attachment=18584] QML的代码如下, import QtQuick 2.1 as QQ2 import Qt3D.Core 2.0 import Qt3D.Render 2.0 import Qt3D.Input 2.0 import Qt3D.Extras 2.0 Entity { id: root RenderSettings { id: renderSettings activeFrameGraph: ForwardRenderer { } } Entity { id: background1 components: [ mesh, transform, material ] PlaneMesh { id: mesh width: 2.0 height: 2.0 meshResolution: Qt.size( 2, 2 ) } Transform { id: transform // Rotate the plane so that it faces us rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 90) } Material { id: material effect:effect1 Effect { id: effect1 techniques: [technique1] Technique { id: technique1 renderPasses: [renderPass1] filterKeys: [filterKey1] graphicsApiFilter { api: GraphicsApiFilter.OpenGL profile: GraphicsApiFilter.CoreProfile majorVersion: 3 minorVersion: 1 } FilterKey { id:filterKey1 name: "renderingStyle"; value: "forward" } RenderPass { id: renderPass1 shaderProgram: shaderProgram1 ShaderProgram { id: shaderProgram1 vertexShaderCode: loadSource( "qrc:/shaders/background.vert" ) fragmentShaderCode: loadSource( "qrc:/shaders/background.frag" ) } } } } } } } 其中shaders/background.vert为, #version 150 core in vec4 vertexPosition; in vec2 vertexTexCoord; out vec2 texCoord; uniform mat4 modelMatrix; void main() { texCoord = vertexTexCoord; gl_Position = modelMatrix * vertexPosition; } shaders/background.frag为, #version 150 core in vec2 texCoord; out vec4 fragColor; uniform vec3 color1 = vec3(125.0/255.0,105.0/255.0,115.0/255.0); uniform vec3 color2 = vec3(1.0, 1.0, 1.0); void main() { fragColor = vec4( mix( color1, color2, texCoord.t ), 1.0 ); } 因为种种原因,现在不能用QML了,因此,决定用C++实现上面的功能。C++代码如下, #include <QGuiApplication> #include <Qt3DCore/QEntity> #include <Qt3DCore/QAspectEngine> #include <Qt3DRender/QCamera> #include <Qt3DInput/QInputAspect> #include <Qt3DRender/QRenderAspect> #include <Qt3DExtras/QPhongMaterial> #include <Qt3DExtras/QDiffuseMapMaterial> #include <Qt3DExtras/QPhongMaterial> #include <Qt3DExtras/QForwardRenderer> #include <Qt3DRender/QTextureImage> #include <Qt3DExtras/qt3dwindow.h> #include <Qt3DExtras/qfirstpersoncameracontroller.h> #include <Qt3DExtras/QCylinderMesh> #include <QOrbitCameraController> #include<QFile> #include <QTextStream> #include <Qt3DRender/qpointlight.h> #include<Qt3DCore> #include<Qt3DRender> #include <Qt3DExtras/QPlaneMesh> int main(int argc, char* argv[]) { QGuiApplication app(argc, argv); Qt3DExtras::Qt3DWindow view; // Scene Root Qt3DCore::QEntity *sceneRoot = new Qt3DCore::QEntity(); //Background effect Qt3DRender::QTechnique* pTechnique = new Qt3DRender::QTechnique(); Qt3DRender::QGraphicsApiFilter* pGraphicApiFilter = new Qt3DRender::QGraphicsApiFilter(pTechnique); pGraphicApiFilter->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL); pGraphicApiFilter->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile); pGraphicApiFilter->setMajorVersion(3); pGraphicApiFilter->setMinorVersion(1); Qt3DRender::QFilterKey* pFilterKey = new Qt3DRender::QFilterKey(); pFilterKey->setName("renderingStyle"); pFilterKey->setValue("forward"); Qt3DRender::QShaderProgram* pShaderProgram = new Qt3DRender::QShaderProgram(); pShaderProgram->setVertexShaderCode(pShaderProgram->loadSource(QUrl("qrc:/Shader/background.vert"))); pShaderProgram->setFragmentShaderCode(pShaderProgram->loadSource(QUrl("qrc:/Shader/background.frag"))); Qt3DRender::QRenderPass* pRendPass = new Qt3DRender::QRenderPass(); pRendPass->setShaderProgram(pShaderProgram); pTechnique->addFilterKey(pFilterKey); pTechnique->addRenderPass(pRendPass); Qt3DRender::QEffect* pEffect=new Qt3DRender::QEffect(); pEffect->addTechnique(pTechnique); Qt3DCore::QEntity* pBackgroundEntity = new Qt3DCore::QEntity(sceneRoot); Qt3DRender::QMaterial* pMaterial=new Qt3DRender::QMaterial(pBackgroundEntity); pMaterial->setEffect(pEffect); Qt3DCore::QTransform* pTransform = new Qt3DCore::QTransform(pBackgroundEntity); pTransform->setRotationX(90.0f); Qt3DExtras::QPlaneMesh* pPlaneMesh = new Qt3DExtras::QPlaneMesh(pBackgroundEntity); pPlaneMesh->setWidth(2.0f); pPlaneMesh->setHeight(2.0f); pPlaneMesh->setMeshResolution(QSize(2,2)); pBackgroundEntity->addComponent(pTransform); pBackgroundEntity->addComponent(pPlaneMesh); pBackgroundEntity->addComponent(pMaterial); // Scene Camera Qt3DRender::QCamera *basicCamera = view.camera(); basicCamera->setProjectionType(Qt3DRender::QCameraLens::PerspectiveProjection); basicCamera->lens()->setPerspectiveProjection(120.0f, 16.0f / 9.0f, 0.1f, 1000.0f); basicCamera->setUpVector(QVector3D(0.0f, 1.0f, 0.0f)); basicCamera->setViewCenter(QVector3D(0.0f, 0.0f, 0.0f)); basicCamera->setPosition(QVector3D(0.0f, 10.0f, 25.0f)); Qt3DExtras::QForwardRenderer* pForwardRenderer = new Qt3DExtras::QForwardRenderer(); pForwardRenderer->setCamera(basicCamera); pForwardRenderer->setClearColor(QColor(255,0,0,255)); // Qt3DRender::QRenderSettings* pRenderSettings = new Qt3DRender::QRenderSettings(sceneRoot); // pRenderSettings->setActiveFrameGraph(pForwardRenderer); // For camera controls Qt3DExtras::QOrbitCameraController *camController = new Qt3DExtras::QOrbitCameraController(sceneRoot); camController->setCamera(basicCamera); view.setRootEntity(sceneRoot); view.show(); return app.exec(); } 用的是Qt Creator 4.5配上Qt 5.10 整个C++代码,就是照着QML代码,翻译了一遍,但C++的实现方式,绘制的背景只有白色。 麻烦大神们看看我的问题在哪里?谢谢 |
|