• 5124阅读
  • 3回复

QML进行Qt3D场景绘制正常,但使用C++却不行 [复制链接]

上一主题 下一主题
离线ylw123
 

只看楼主 倒序阅读 楼主  发表于: 2018-03-16
回复本帖可获得2RMB金钱奖励!
每人最多可获奖1次,奖池剩余4RMB金钱 (中奖几率100%)


用QML绘制一个Qt3D场景,使其背景为渐变色,效果如下,一切正常
window.open('http://www.qtcn.org/bbs/attachment/Mon_1803/60_188188_f349f8a9377dbd3.png?8');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >


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++的实现方式,绘制的背景只有白色。
麻烦大神们看看我的问题在哪里?谢谢
离线never_forget

只看该作者 1楼 发表于: 2018-03-16
回帖奖励+ 2
3D 我不是很懂,但是楼主 6 点就来发帖子的精神深深打动了我~

    
离线mmario

只看该作者 2楼 发表于: 2018-03-16
回帖奖励+ 2
3D还不是很多,希望以后和楼主多多交流!
离线optphantom

只看该作者 3楼 发表于: 2018-03-17
回帖奖励+ 2
Qt3D不会,只会OpenGL
快速回复
限100 字节
 
上一个 下一个