diff options
author | Wieland Hagen <wieland.hagen@kdab.com> | 2017-08-02 18:02:40 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-08-02 17:42:56 +0000 |
commit | e0ecb87437be9d9400adcf5c0c51f8e05ee98ec6 (patch) | |
tree | 8a2e49766fc0177cbbd66531f8256ea9e869f70c /tests | |
parent | e96ed4009c2dea4f5269521f04d7c90aaa02c4b0 (diff) |
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 <sean.harmer@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/manual/deferred-renderer-qml/SceneEffect.qml | 16 | ||||
-rw-r--r-- | tests/manual/deferred-renderer-qml/SceneEntity.qml | 59 | ||||
-rw-r--r-- | tests/manual/deferred-renderer-qml/ScreenQuadEntity.qml | 98 | ||||
-rw-r--r-- | tests/manual/deferred-renderer-qml/main.qml | 9 |
4 files changed, 119 insertions, 63 deletions
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 } } |