summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorWieland Hagen <wieland.hagen@kdab.com>2017-08-02 18:02:40 +0200
committerSean Harmer <sean.harmer@kdab.com>2017-08-02 17:42:56 +0000
commite0ecb87437be9d9400adcf5c0c51f8e05ee98ec6 (patch)
tree8a2e49766fc0177cbbd66531f8256ea9e869f70c /tests
parente96ed4009c2dea4f5269521f04d7c90aaa02c4b0 (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.qml16
-rw-r--r--tests/manual/deferred-renderer-qml/SceneEntity.qml59
-rw-r--r--tests/manual/deferred-renderer-qml/ScreenQuadEntity.qml98
-rw-r--r--tests/manual/deferred-renderer-qml/main.qml9
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 }
}