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