summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire350@gmail.com>2015-07-19 18:20:06 +0200
committerPaul Lemire <paul.lemire@kdab.com>2015-07-27 06:04:35 +0000
commit3fe37f854dcaa2d92e8936ccddd07800fb4d04d3 (patch)
tree31a60bef6962e006cab547b43c439eecad18be62 /src
parent890ab52165bd1cf792f8f5e793a09f9404d8c231 (diff)
Added PhongAlphaMaterial for qml
cpp version to follow Change-Id: I7d6f48f6c9b54810fb127dfe6371ede026f129bf Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/quick3d/imports/render/defaults/defaults.pri3
-rw-r--r--src/quick3d/imports/render/defaults/qml/PhongAlphaMaterial.qml139
-rw-r--r--src/quick3d/imports/render/qt3dquick3drendererplugin.cpp1
-rw-r--r--src/render/render.qrc4
-rw-r--r--src/render/shaders/es2/phongalpha.frag43
-rw-r--r--src/render/shaders/es2/phongalpha.vert17
-rw-r--r--src/render/shaders/gl3/phongalpha.frag46
-rw-r--r--src/render/shaders/gl3/phongalpha.vert19
8 files changed, 271 insertions, 1 deletions
diff --git a/src/quick3d/imports/render/defaults/defaults.pri b/src/quick3d/imports/render/defaults/defaults.pri
index edaa567cd..8bfe8f126 100644
--- a/src/quick3d/imports/render/defaults/defaults.pri
+++ b/src/quick3d/imports/render/defaults/defaults.pri
@@ -14,4 +14,5 @@ QML_FILES = \
$$PWD/qml/ForwardRenderer.qml \
$$PWD/qml/PerVertexColorMaterial.qml \
$$PWD/qml/SkyboxEntity.qml \
- $$PWD/qml/GoochMaterial.qml
+ $$PWD/qml/GoochMaterial.qml \
+ $$PWD/qml/PhongAlphaMaterial.qml
diff --git a/src/quick3d/imports/render/defaults/qml/PhongAlphaMaterial.qml b/src/quick3d/imports/render/defaults/qml/PhongAlphaMaterial.qml
new file mode 100644
index 000000000..b985c213b
--- /dev/null
+++ b/src/quick3d/imports/render/defaults/qml/PhongAlphaMaterial.qml
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 Paul Lemire
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt3D module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** 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 The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/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 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later 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 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D 2.0
+import Qt3D.Renderer 2.0
+
+Material {
+ id:root
+ property color ambient: Qt.rgba( 0.05, 0.05, 0.05, 1.0 )
+ property color diffuse: Qt.rgba( 0.7, 0.7, 0.7, 1.0 )
+ property color specular: Qt.rgba( 0.95, 0.95, 0.95, 1.0 )
+ property real shininess: 150.0
+ property real alpha: 0.5
+
+
+ ShaderProgram {
+ id: gl3PhongAlphaShader
+ vertexShaderCode: loadSource("qrc:/shaders/gl3/phongalpha.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/gl3/phongalpha.frag")
+ }
+
+ ShaderProgram {
+ id: gl2es2PhongAlphaShader
+ vertexShaderCode: loadSource("qrc:/shaders/es2/phongalpha.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/es2/phongalpha.frag")
+ }
+
+ effect: Effect {
+
+ parameters: [
+ Parameter { name: "alpha"; value: root.alpha },
+ Parameter { name: "ka"; value: Qt.vector3d(root.ambient.r, root.ambient.g, root.ambient.b) },
+ Parameter { name: "kd"; value: Qt.vector3d(root.diffuse.r, root.diffuse.g, root.diffuse.b) },
+ Parameter { name: "ks"; value: Qt.vector3d(root.specular.r, root.specular.g, root.specular.b) },
+ Parameter { name: "shininess"; value: root.shininess },
+ Parameter { name: "lightPosition"; value: Qt.vector4d(1.0, 1.0, 0.0, 1.0) },
+ Parameter { name: "lightIntensity"; value: Qt.vector3d(1.0, 1.0, 1.0) }
+ ]
+
+ techniques: [
+ // GL 3 Technique
+ Technique {
+ openGLFilter {
+ api: OpenGLFilter.Desktop
+ profile: OpenGLFilter.Core
+ majorVersion: 3
+ minorVersion: 1
+ }
+ renderPasses: RenderPass {
+ shaderProgram: gl3PhongAlphaShader
+ renderStates: [
+ DepthMask { mask: false },
+ BlendState {
+ srcRGB: BlendState.SrcAlpha
+ dstRGB: BlendState.OneMinusSrcAlpha
+ },
+ BlendEquation {mode: BlendEquation.FuncAdd}
+ ]
+ }
+ },
+
+ // GL 2 Technique
+ Technique {
+ openGLFilter {
+ api: OpenGLFilter.Desktop
+ profile: OpenGLFilter.None
+ majorVersion: 2
+ minorVersion: 0
+ }
+ renderPasses: RenderPass {
+ shaderProgram: gl2es2PhongAlphaShader
+ renderStates: [
+ DepthMask { mask: false },
+ BlendState {
+ srcRGB: BlendState.SrcAlpha
+ dstRGB: BlendState.OneMinusSrcAlpha
+ },
+ BlendEquation {mode: BlendEquation.FuncAdd}
+ ]
+ }
+ },
+
+ // ES 2 Technique
+ Technique {
+ openGLFilter {
+ api: OpenGLFilter.ES
+ profile: OpenGLFilter.None
+ majorVersion: 2
+ minorVersion: 0
+ }
+ renderPasses: RenderPass {
+ shaderProgram: gl2es2PhongAlphaShader
+ renderStates: [
+ DepthMask { mask: false },
+ BlendState {
+ srcRGB: BlendState.SrcAlpha
+ dstRGB: BlendState.OneMinusSrcAlpha
+ },
+ BlendEquation {mode: BlendEquation.FuncAdd}
+ ]
+ }
+ }
+ ]
+ }
+}
+
diff --git a/src/quick3d/imports/render/qt3dquick3drendererplugin.cpp b/src/quick3d/imports/render/qt3dquick3drendererplugin.cpp
index e26c5d639..bb01333f8 100644
--- a/src/quick3d/imports/render/qt3dquick3drendererplugin.cpp
+++ b/src/quick3d/imports/render/qt3dquick3drendererplugin.cpp
@@ -122,6 +122,7 @@ static const struct {
} qmldir [] = {
// Materials
{ "PhongMaterial", 2, 0 },
+ { "PhongAlphaMaterial", 2, 0 },
{ "DiffuseMapMaterial", 2, 0 },
{ "DiffuseSpecularMapMaterial", 2, 0 },
{ "NormalDiffuseMapAlphaMaterial", 2, 0 },
diff --git a/src/render/render.qrc b/src/render/render.qrc
index 21db94917..0675f9662 100644
--- a/src/render/render.qrc
+++ b/src/render/render.qrc
@@ -53,5 +53,9 @@
<file>shaders/gl3/gooch.frag</file>
<file>shaders/es2/gooch.frag</file>
<file>shaders/es2/gooch.vert</file>
+ <file>shaders/gl3/phongalpha.frag</file>
+ <file>shaders/gl3/phongalpha.vert</file>
+ <file>shaders/es2/phongalpha.frag</file>
+ <file>shaders/es2/phongalpha.vert</file>
</qresource>
</RCC>
diff --git a/src/render/shaders/es2/phongalpha.frag b/src/render/shaders/es2/phongalpha.frag
new file mode 100644
index 000000000..6f1d4e051
--- /dev/null
+++ b/src/render/shaders/es2/phongalpha.frag
@@ -0,0 +1,43 @@
+#define FP highp
+
+uniform FP vec4 lightPosition;
+uniform FP vec3 lightIntensity;
+
+// TODO: Replace with a struct
+uniform FP vec3 ka; // Ambient reflectivity
+uniform FP vec3 kd; // Diffuse reflectivity
+uniform FP vec3 ks; // Specular reflectivity
+uniform FP float shininess; // Specular shininess factor
+uniform FP float alpha;
+
+varying FP vec3 position;
+varying FP vec3 normal;
+
+FP vec3 adsModel( const FP vec3 pos, const FP vec3 n )
+{
+ // Calculate the vector from the light to the fragment
+ FP vec3 s = normalize( vec3( lightPosition ) - pos );
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ FP vec3 v = normalize( -pos );
+
+ // Reflect the light beam using the normal at this fragment
+ FP vec3 r = reflect( -s, n );
+
+ // Calculate the diffuse component
+ FP float diffuse = max( dot( s, n ), 0.0 );
+
+ // Calculate the specular component
+ FP float specular = 0.0;
+ if ( dot( s, n ) > 0.0 )
+ specular = pow( max( dot( r, v ), 0.0 ), shininess );
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ( ka + kd * diffuse + ks * specular );
+}
+
+void main()
+{
+ gl_FragColor = vec4( adsModel( position, normalize( normal ) ), alpha );
+}
diff --git a/src/render/shaders/es2/phongalpha.vert b/src/render/shaders/es2/phongalpha.vert
new file mode 100644
index 000000000..03a416213
--- /dev/null
+++ b/src/render/shaders/es2/phongalpha.vert
@@ -0,0 +1,17 @@
+attribute vec3 vertexPosition;
+attribute vec3 vertexNormal;
+
+varying vec3 position;
+varying vec3 normal;
+
+uniform mat4 modelView;
+uniform mat3 modelViewNormal;
+uniform mat4 mvp;
+
+void main()
+{
+ normal = normalize( modelViewNormal * vertexNormal );
+ position = vec3( modelView * vec4( vertexPosition, 1.0 ) );
+
+ gl_Position = mvp * vec4( vertexPosition, 1.0 );
+}
diff --git a/src/render/shaders/gl3/phongalpha.frag b/src/render/shaders/gl3/phongalpha.frag
new file mode 100644
index 000000000..6c18ae407
--- /dev/null
+++ b/src/render/shaders/gl3/phongalpha.frag
@@ -0,0 +1,46 @@
+#version 150 core
+
+// TODO: Replace with a uniform block
+uniform vec4 lightPosition;
+uniform vec3 lightIntensity;
+
+// TODO: Replace with a struct
+uniform vec3 ka; // Ambient reflectivity
+uniform vec3 kd; // Diffuse reflectivity
+uniform vec3 ks; // Specular reflectivity
+uniform float shininess; // Specular shininess factor
+uniform float alpha;
+
+in vec3 position;
+in vec3 normal;
+
+out vec4 fragColor;
+
+vec3 adsModel( const in vec3 pos, const in vec3 n )
+{
+ // Calculate the vector from the light to the fragment
+ vec3 s = normalize( vec3( lightPosition ) - pos );
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ vec3 v = normalize( -pos );
+
+ // Reflect the light beam using the normal at this fragment
+ vec3 r = reflect( -s, n );
+
+ // Calculate the diffuse component
+ float diffuse = max( dot( s, n ), 0.0 );
+
+ // Calculate the specular component
+ float specular = 0.0;
+ if ( dot( s, n ) > 0.0 )
+ specular = pow( max( dot( r, v ), 0.0 ), shininess );
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ( ka + kd * diffuse + ks * specular );
+}
+
+void main()
+{
+ fragColor = vec4( adsModel( position, normalize( normal ) ), alpha );
+}
diff --git a/src/render/shaders/gl3/phongalpha.vert b/src/render/shaders/gl3/phongalpha.vert
new file mode 100644
index 000000000..c0f907f29
--- /dev/null
+++ b/src/render/shaders/gl3/phongalpha.vert
@@ -0,0 +1,19 @@
+#version 150 core
+
+in vec3 vertexPosition;
+in vec3 vertexNormal;
+
+out vec3 position;
+out vec3 normal;
+
+uniform mat4 modelView;
+uniform mat3 modelViewNormal;
+uniform mat4 mvp;
+
+void main()
+{
+ normal = normalize( modelViewNormal * vertexNormal );
+ position = vec3( modelView * vec4( vertexPosition, 1.0 ) );
+
+ gl_Position = mvp * vec4( vertexPosition, 1.0 );
+}