diff options
-rw-r--r-- | examples/deferred-renderer/DeferredRenderer.qml | 75 | ||||
-rw-r--r-- | examples/deferred-renderer/deferred-renderer.pro | 18 | ||||
-rw-r--r-- | examples/deferred-renderer/deferred-renderer.qrc | 6 | ||||
-rw-r--r-- | examples/deferred-renderer/main.cpp | 63 | ||||
-rw-r--r-- | examples/deferred-renderer/main.qml | 359 | ||||
-rw-r--r-- | examples/examples.pro | 6 |
6 files changed, 526 insertions, 1 deletions
diff --git a/examples/deferred-renderer/DeferredRenderer.qml b/examples/deferred-renderer/DeferredRenderer.qml new file mode 100644 index 000000000..0ffbbf963 --- /dev/null +++ b/examples/deferred-renderer/DeferredRenderer.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import Qt3D 2.0 +import Qt3D.Render 2.0 + +Viewport { + rect : Qt.rect(0.0, 0.0, 1.0, 1.0) + + property alias gBuffer : gBufferTargetSelector.target + property alias camera : sceneCameraSelector.camera + + LayerFilter { + layers : "scene" + + RenderTargetSelector { + id : gBufferTargetSelector + + RenderPassFilter { + id : geometryPass + criteria : Criterion { name : "pass"; value : "geometry" } + + CameraSelector { + id : sceneCameraSelector + } + } + } + } + + LayerFilter { + layers : "screenQuad" + RenderPassFilter { + id : finalPass + criteria : Criterion { name : "pass"; value : "final" } + } + } +} diff --git a/examples/deferred-renderer/deferred-renderer.pro b/examples/deferred-renderer/deferred-renderer.pro new file mode 100644 index 000000000..999c0a454 --- /dev/null +++ b/examples/deferred-renderer/deferred-renderer.pro @@ -0,0 +1,18 @@ +TEMPLATE = app + +QT += 3dcore 3drenderer 3dquick qml quick + +include("../exampleresources/exampleresources.pri") + +HEADERS += \ + + +OTHER_FILES += \ + main.qml \ + DeferredRenderer.qml + +RESOURCES += \ + deferred-renderer.qrc + +SOURCES += \ + main.cpp diff --git a/examples/deferred-renderer/deferred-renderer.qrc b/examples/deferred-renderer/deferred-renderer.qrc new file mode 100644 index 000000000..1af461305 --- /dev/null +++ b/examples/deferred-renderer/deferred-renderer.qrc @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + <file>DeferredRenderer.qml</file> + </qresource> +</RCC> diff --git a/examples/deferred-renderer/main.cpp b/examples/deferred-renderer/main.cpp new file mode 100644 index 000000000..17d6b5183 --- /dev/null +++ b/examples/deferred-renderer/main.cpp @@ -0,0 +1,63 @@ + +/**************************************************************************** +** +** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <Qt3DQuick/quickwindow.h> +#include <Qt3DRenderer/rendereraspect.h> + +#include <exampleresources.h> + +#include <QGuiApplication> +#include <QtQml> + +int main(int argc, char* argv[]) +{ + QGuiApplication app(argc, argv); + + initializeAssetResources("../exampleresources/example-assets.qrb"); + + Qt3D::Quick::QuickWindow view; + view.registerAspect(new Qt3D::RendererAspect()); + view.setSource(QUrl("qrc:/main.qml")); + view.show(); + + return app.exec(); +} diff --git a/examples/deferred-renderer/main.qml b/examples/deferred-renderer/main.qml new file mode 100644 index 000000000..cab849770 --- /dev/null +++ b/examples/deferred-renderer/main.qml @@ -0,0 +1,359 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 as QQ2 +import Qt3D 2.0 +import Qt3D.Render 2.0 + +Entity { + id : root + + RenderTarget { + id : gBuffer + attachments : [ + + RenderAttachment { + name : "color" + type : RenderAttachment.ColorAttachment0 + texture : Texture { + id : colorAttachment + target : Texture.Target2D + width : 1024 + height : 768 + format : Texture.RGBA32F + generateMipMaps : false + magnificationFilter : Texture.Linear + minificationFilter : Texture.Linear + wrapMode : Texture.ClampToEdge + } + }, + RenderAttachment { + name : "position" + type : RenderAttachment.ColorAttachment1 + texture : Texture { + id : positionAttachment + target : Texture.Target2D + width : 1024 + height : 768 + format : Texture.RGB32F + generateMipMaps : false + magnificationFilter : Texture.Linear + minificationFilter : Texture.Linear + wrapMode : Texture.ClampToEdge + } + }, + RenderAttachment { + name : "normal" + type : RenderAttachment.ColorAttachment2 + texture : Texture { + id : normalAttachment + target : Texture.Target2D + width : 1024 + height : 768 + format : Texture.RGB16F + generateMipMaps : false + magnificationFilter : Texture.Linear + minificationFilter : Texture.Linear + wrapMode : Texture.ClampToEdge + } + }, + RenderAttachment { + name : "depth" + type : RenderAttachment.DepthAttachment + texture : Texture { + id : depthAttachment + target : Texture.Target2D + width : 1024 + height : 768 + format : Texture.D32F + generateMipMaps : false + magnificationFilter : Texture.Linear + minificationFilter : Texture.Linear + wrapMode : Texture.ClampToEdge + } + } + ] // attachments + } + + components : FrameGraph { + id : deferredFrameGraphComponent + activeFrameGraph: DeferredRenderer { + gBuffer : gBuffer + camera : camera + } + } + + Configuration { + controlledCamera: camera + } + + Entity { + id : screenQuadEntity + components : [ + Layer { + name : "screenQuad" + }, + PlaneMesh { + width: 2.0 + height: 2.0 + meshResolution: Qt.size(2, 2) + }, + Transform { // We rotate the plane so that it faces us + Rotate { + axis : Qt.vector3d(1.0, 0.0, 0.0) + angle : 90 + } + }, + Material { + parameters : [ + Parameter { name : "color"; value : colorAttachment }, + Parameter { name : "position"; value : positionAttachment }, + Parameter { name : "normal"; value : normalAttachment }, + Parameter { name : "winSize"; value : Qt.size(1024, 768) } + ] + effect : Effect { + techniques : Technique { + openGLFilter {api : OpenGLFilter.Desktop; profile : OpenGLFilter.Core; minorVersion : 1; majorVersion : 3 } + renderPasses : RenderPass { + criteria : Criterion { name : "pass"; value : "final" } + shaderProgram : ShaderProgram { + id : finalShader + vertexShader: + " + #version 140 + + in vec4 vertexPosition; + uniform mat4 modelMatrix; + + void main() + { + gl_Position = modelMatrix * vertexPosition; + } + " + fragmentShader: + " + #version 140 + + uniform sampler2D color; + uniform sampler2D position; + uniform sampler2D normal; + uniform vec2 winSize; + + out vec4 fragColor; + + struct PointLight + { + vec3 position; + vec3 direction; + vec4 color; + float intensity; + }; + + const int lightCount = 3; + uniform PointLight pointLights[lightCount]; + + void main() + { + vec2 texCoord = gl_FragCoord.xy / winSize; + vec4 col = texture2D(color, texCoord); + vec3 pos = texture2D(position, texCoord).xyz; + vec3 norm = texture2D(normal, texCoord).xyz; + + vec4 lightColor; + for (int i = 0; i < 3; i++) { + vec3 s = normalize(pointLights[i].position - pos); + lightColor += pointLights[i].color * (pointLights[i].intensity * max(dot(s, norm), 0.0)); + } + lightColor /= float(lightCount); + fragColor = col * lightColor; + } + " + } + } + } + } + } + ] + + } + + Entity { + id : sceneEntity + + components : PointLight { + color : "red" + intensity : 3.0 + } + + Camera { + id: camera + lens : CameraLens { + projectionType: CameraLens.PerspectiveProjection + fieldOfView: 45 + aspectRatio: 16/9 + nearPlane : 0.01 + farPlane : 1000.0 + } + transform : Transform { + LookAt { + position: Qt.vector3d( 10.0, 10.0, -25.0 ) + upVector: Qt.vector3d( 0.0, 1.0, 0.0 ) + viewCenter: Qt.vector3d( 0.0, 0.0, 10.0 ) + } + } + } + + Layer { + id : sceneLayer + name : "scene" + } + + SphereMesh { + id : sphereMesh + rings: 50 + slices: 100 + } + + Effect { + id : sceneMaterialEffect + techniques : Technique { + openGLFilter {api : OpenGLFilter.Desktop; profile : OpenGLFilter.Core; minorVersion : 1; majorVersion : 3 } + renderPasses : RenderPass { + criteria : Criterion { name : "pass"; value : "geometry" } + shaderProgram : ShaderProgram { + id : sceneShader + vertexShader: + " + #version 140 + + in vec4 vertexPosition; + in vec3 vertexNormal; + + out vec4 color0; + out vec3 position0; + out vec3 normal0; + + uniform mat4 mvp; + uniform mat4 modelView; + uniform mat3 modelViewNormal; + uniform vec4 meshColor; + + void main() + { + color0 = meshColor; + position0 = vec3(modelView * vertexPosition); + normal0 = normalize(modelViewNormal * vertexNormal); + gl_Position = mvp * vertexPosition; + } + " + fragmentShader: + " + #version 140 + + in vec4 color0; + in vec3 position0; + in vec3 normal0; + + out vec4 color; + out vec3 position; + out vec3 normal; + + void main() + { + color = color0; + position = position0; + normal = normal0; + } + " + } + } + } + } + + Entity { + id : sphere1 + + property Material material : Material { + effect : sceneMaterialEffect + parameters : Parameter { name : "meshColor"; value : "dodgerblue" } + } + + property Transform transform : Transform { + Translate{ dx: -10; dy: 0; dz : 25 } + } + + property PointLight light : PointLight { + color : "yellow" + intensity : 1.0 + } + + components : [ + sphereMesh, + material, + transform, + light, + sceneLayer + ] + } + + Entity { + id : sphere2 + + property Material material : Material { + effect : sceneMaterialEffect + parameters : Parameter { name : "meshColor"; value : "green" } + } + + property PointLight light : PointLight { + color : "white" + intensity : 3.0 + } + + components : [ + sphereMesh, + material, + light, + sceneLayer + ] + } + + } +} diff --git a/examples/examples.pro b/examples/examples.pro index 7c363c9a6..3a8c21656 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -39,6 +39,9 @@ src_rollerball.subdir = $$PWD/rollerball src_rollerball.target = sub-rollerball src_rollerball.depends = src_exampleresources +src_deferredrenderer.subdir = $$PWD/deferred-renderer +src_deferredrenderer.target = sub-deferredrenderer +src_deferredrenderer.depends = src_exampleresources SUBDIRS += \ src_exampleresources \ @@ -49,7 +52,8 @@ SUBDIRS += \ src_multiviewport \ src_torusqml \ src_toruscpp \ - src_bigmodelqml + src_bigmodelqml \ + src_deferredrenderer # TODO Port the old examples to new APIs #SUBDIRS += qt3d |