From e0ecb87437be9d9400adcf5c0c51f8e05ee98ec6 Mon Sep 17 00:00:00 2001 From: Wieland Hagen Date: Wed, 2 Aug 2017 18:02:40 +0200 Subject: Fix deferred-renderer-qml lighting The lights must be part of entities that are actually included in the final scene effect layer. So the light world positions have to be forwarded from the actual scene entities to some "dummy" light entities that exist just for the final scene effect render step. Also correct model / modelNormal matrices must be used for global normal/position calculation in the GBuffer render step. Task-number: QTBUG-46707 Change-Id: I380d2e2ecb008ab0606dcd36cd5d98dd1ec41ba6 Reviewed-by: Sean Harmer --- tests/manual/deferred-renderer-qml/SceneEffect.qml | 16 ++-- tests/manual/deferred-renderer-qml/SceneEntity.qml | 59 ++++--------- .../deferred-renderer-qml/ScreenQuadEntity.qml | 98 +++++++++++++++++++--- tests/manual/deferred-renderer-qml/main.qml | 9 +- 4 files changed, 119 insertions(+), 63 deletions(-) (limited to 'tests') diff --git a/tests/manual/deferred-renderer-qml/SceneEffect.qml b/tests/manual/deferred-renderer-qml/SceneEffect.qml index 3ec1983fe..0ca081355 100644 --- a/tests/manual/deferred-renderer-qml/SceneEffect.qml +++ b/tests/manual/deferred-renderer-qml/SceneEffect.qml @@ -72,15 +72,15 @@ Effect { out vec3 normal0; uniform mat4 mvp; - uniform mat4 modelView; - uniform mat3 modelViewNormal; + uniform mat4 modelMatrix; + uniform mat3 modelNormalMatrix; uniform vec4 meshColor; void main() { color0 = meshColor; - position0 = vec3(modelView * vertexPosition); - normal0 = normalize(modelViewNormal * vertexNormal); + position0 = vec3(modelMatrix * vertexPosition); + normal0 = normalize(modelNormalMatrix * vertexNormal); gl_Position = mvp * vertexPosition; } " @@ -123,15 +123,15 @@ Effect { varying vec3 normal0; uniform mat4 mvp; - uniform mat4 modelView; - uniform mat3 modelViewNormal; + uniform mat4 modelMatrix; + uniform mat3 modelNormalMatrix; uniform vec4 meshColor; void main() { color0 = meshColor; - position0 = vec3(modelView * vertexPosition); - normal0 = normalize(modelViewNormal * vertexNormal); + position0 = vec3(modelMatrix * vertexPosition); + normal0 = normalize(modelNormalMatrix * vertexNormal); gl_Position = mvp * vertexPosition; } " diff --git a/tests/manual/deferred-renderer-qml/SceneEntity.qml b/tests/manual/deferred-renderer-qml/SceneEntity.qml index 001a24854..6a34be7fb 100644 --- a/tests/manual/deferred-renderer-qml/SceneEntity.qml +++ b/tests/manual/deferred-renderer-qml/SceneEntity.qml @@ -48,15 +48,26 @@ Entity { readonly property Camera camera: camera readonly property Layer layer: sceneLayer + readonly property vector3d light1Pos : sphere1.transform.translation + readonly property vector3d light2Pos : sphere2.transform.translation + readonly property vector3d light3Pos : light3Transform.translation + readonly property vector3d light4Pos : Qt.vector3d(5, 2, 7) + property PointLight light: PointLight { color : "white" - intensity : 4.0 + intensity : 0.0 QQ2.ColorAnimation on color { from: "white"; to: "blue"; duration: 4000; loops: 2 } - QQ2.NumberAnimation on intensity { from: 0; to: 5.0; duration: 1000; loops: QQ2.Animation.Infinite } + QQ2.SequentialAnimation on intensity { + QQ2.NumberAnimation { + from: 0; to: 3.0; duration: 500 + } + QQ2.NumberAnimation { + from: 3.0; to: 0.0; duration: 500 + } + loops: QQ2.Animation.Infinite + } } - components: [ root.light ] - // Global elements Camera { id: camera @@ -97,21 +108,15 @@ Entity { QQ2.SequentialAnimation { loops: QQ2.Animation.Infinite - running: false - QQ2.NumberAnimation { target: sphere1Transform; property: "x"; to: 6; duration: 2000 } - QQ2.NumberAnimation { target: sphere1Transform; property: "x"; to: -10; duration: 2000 } - } - - property PointLight light : PointLight { - color : "green" - intensity : 0.3 + running: true + QQ2.NumberAnimation { target: sphere1Transform; property: "x"; to: 3; duration: 2000 } + QQ2.NumberAnimation { target: sphere1Transform; property: "x"; to: -5; duration: 2000 } } components : [ sphereMesh, sphere1.material, sphere1.transform, - sphere1.light, sceneLayer ] } @@ -124,11 +129,6 @@ Entity { parameters : Parameter { name : "meshColor"; value : "green" } } - property PointLight light : PointLight { - color : "orange" - intensity : 0.7 - } - property Transform transform: Transform { translation: Qt.vector3d(5, 0, 5) } @@ -137,17 +137,12 @@ Entity { sphereMesh, sphere2.transform, sphere2.material, - sphere2.light, sceneLayer ] } Entity { id: light3 - property PointLight light : PointLight { - color : "white" - intensity : 0.5 - } property Material material : Material { effect : sceneMaterialEffect @@ -170,26 +165,8 @@ Entity { components: [ sphereMesh, light3.material, - light3.light, light3.transform, sceneLayer ] } - - Entity { - id: light4 - property PointLight light : PointLight { - color : "white" - intensity : 0.2 - } - property Transform transform: Transform { - translation: Qt.vector3d(5, 2, 7) - } - - components: [ - light4.light, - light4.transform, - sceneLayer - ] - } } diff --git a/tests/manual/deferred-renderer-qml/ScreenQuadEntity.qml b/tests/manual/deferred-renderer-qml/ScreenQuadEntity.qml index 6c5284d5e..3dae2b79a 100644 --- a/tests/manual/deferred-renderer-qml/ScreenQuadEntity.qml +++ b/tests/manual/deferred-renderer-qml/ScreenQuadEntity.qml @@ -42,23 +42,95 @@ import Qt3D.Render 2.0 import Qt3D.Extras 2.0 Entity { + id: root + readonly property Layer layer: screenQuadLayer + property PointLight baseLight + property vector3d light1Pos + property vector3d light2Pos + property vector3d light3Pos + property vector3d light4Pos - components : [ - Layer { id: screenQuadLayer }, + Entity { + components: [ + baseLight, + layer + ] + } - PlaneMesh { - width: 2.0 - height: 2.0 - meshResolution: Qt.size(2, 2) - }, + Entity { + readonly property Transform transform1 : Transform { translation: root.light1Pos } + readonly property PointLight light1 : PointLight { + color : "dodgerblue" + intensity : 0.9 + } + components: [ + transform1, + light1, + layer + ] + } - Transform { // We rotate the plane so that it faces us - rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 90) - }, + Entity { + readonly property Transform transform2 : Transform { translation: root.light2Pos } + readonly property PointLight light2 : PointLight { + color : "green" + intensity : 0.5 + } + components: [ + transform2, + light2, + layer + ] + } + + Entity { + readonly property Transform transform3 : Transform { translation: root.light3Pos } + readonly property PointLight light3 : PointLight { + color : "white" + intensity : 2.0 + } + components: [ + transform3, + light3, + layer + ] + } - Material { - effect : FinalEffect {} + Entity { + readonly property Transform transform4 : Transform { translation: root.light4Pos } + readonly property PointLight light4 : PointLight { + color : "white" + intensity : 0.5 } - ] + components: [ + transform4, + light4, + layer + ] + } + + // We need to have the actual screen quad entity separate from the lights. + // If the lights were sub-entities of this screen quad entity, they would + // be affected by the rotation matrix, and their world positions would thus + // be changed. + Entity { + components : [ + Layer { id: screenQuadLayer }, + + PlaneMesh { + width: 2.0 + height: 2.0 + meshResolution: Qt.size(2, 2) + }, + + Transform { // We rotate the plane so that it faces us + rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 90) + }, + + Material { + effect : FinalEffect {} + } + ] + } } diff --git a/tests/manual/deferred-renderer-qml/main.qml b/tests/manual/deferred-renderer-qml/main.qml index 790911723..8b97bb671 100644 --- a/tests/manual/deferred-renderer-qml/main.qml +++ b/tests/manual/deferred-renderer-qml/main.qml @@ -74,7 +74,14 @@ Entity { FirstPersonCameraController { camera: sceneEntity.camera } - ScreenQuadEntity { id: screenQuadEntity } + ScreenQuadEntity { + id: screenQuadEntity + baseLight: sceneEntity.light + light1Pos: sceneEntity.light1Pos + light2Pos: sceneEntity.light2Pos + light3Pos: sceneEntity.light3Pos + light4Pos: sceneEntity.light4Pos + } SceneEntity { id: sceneEntity } GBufferDebugger { id: debugEntity } } -- cgit v1.2.3