summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-11-30 19:12:51 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-12-01 14:05:44 +0000
commitd763a69c9c2e55f7d358c538335ebf5c62cb5445 (patch)
tree9633975093a3d814ff82185fa612d8278096cd2f
parentbfdaeb1877ec05f7c19eac646358eaf1acddc2eb (diff)
Migrate DiffuseMapMaterial to be light-aware
Change-Id: I79cac9384a258bfd3e106beba1aebb44c5f15491 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/quick3d/imports/render/defaults/qml/DiffuseMapMaterial.qml6
-rw-r--r--src/render/defaults/qdiffusemapmaterial.cpp4
-rw-r--r--src/render/defaults/qdiffusemapmaterial_p.h2
-rw-r--r--src/render/shaders/es2/diffusemap.frag40
-rw-r--r--src/render/shaders/gl3/diffusemap.frag42
5 files changed, 18 insertions, 76 deletions
diff --git a/src/quick3d/imports/render/defaults/qml/DiffuseMapMaterial.qml b/src/quick3d/imports/render/defaults/qml/DiffuseMapMaterial.qml
index 4a26617d8..f9b06afdf 100644
--- a/src/quick3d/imports/render/defaults/qml/DiffuseMapMaterial.qml
+++ b/src/quick3d/imports/render/defaults/qml/DiffuseMapMaterial.qml
@@ -69,12 +69,6 @@ Material {
]
effect: Effect {
-
- parameters: [
- Parameter { name: "lightPosition"; value: Qt.vector4d( 0.0, 0.0, 0.0, 1.0 ) },
- Parameter { name: "lightIntensity"; value: Qt.vector3d( 1.0, 1.0, 1.0 ) }
- ]
-
ShaderProgram {
id: gl2Es2Shader
vertexShaderCode: loadSource("qrc:/shaders/es2/diffusemap.vert")
diff --git a/src/render/defaults/qdiffusemapmaterial.cpp b/src/render/defaults/qdiffusemapmaterial.cpp
index d738e1592..e46fb4e53 100644
--- a/src/render/defaults/qdiffusemapmaterial.cpp
+++ b/src/render/defaults/qdiffusemapmaterial.cpp
@@ -64,8 +64,6 @@ QDiffuseMapMaterialPrivate::QDiffuseMapMaterialPrivate()
, m_diffuseParameter(new QParameter(QStringLiteral("diffuseTexture"), m_diffuseTexture))
, m_specularParameter(new QParameter(QStringLiteral("ks"), QColor::fromRgbF(0.95f, 0.95f, 0.95f, 1.0f)))
, m_shininessParameter(new QParameter(QStringLiteral("shininess"), 150.0f))
- , m_lightPositionParameter(new QParameter(QStringLiteral("lightPosition"), QVector4D(0.0f, 0.0f, 0.0f, 1.0f)))
- , m_lightIntensityParameter(new QParameter(QStringLiteral("lightIntensity"), QVector3D(1.0f, 1.0f, 1.0f)))
, m_textureScaleParameter(new QParameter(QStringLiteral("texCoordScale"), 1.0f))
, m_diffuseMapGL3Technique(new QTechnique())
, m_diffuseMapGL2Technique(new QTechnique())
@@ -121,8 +119,6 @@ void QDiffuseMapMaterialPrivate::init()
m_diffuseMapEffect->addParameter(m_diffuseParameter);
m_diffuseMapEffect->addParameter(m_specularParameter);
m_diffuseMapEffect->addParameter(m_shininessParameter);
- m_diffuseMapEffect->addParameter(m_lightPositionParameter);
- m_diffuseMapEffect->addParameter(m_lightIntensityParameter);
m_diffuseMapEffect->addParameter(m_textureScaleParameter);
q_func()->setEffect(m_diffuseMapEffect);
diff --git a/src/render/defaults/qdiffusemapmaterial_p.h b/src/render/defaults/qdiffusemapmaterial_p.h
index 0badb01ff..667b53ae6 100644
--- a/src/render/defaults/qdiffusemapmaterial_p.h
+++ b/src/render/defaults/qdiffusemapmaterial_p.h
@@ -76,8 +76,6 @@ class QDiffuseMapMaterialPrivate : public QMaterialPrivate
QParameter *m_diffuseParameter;
QParameter *m_specularParameter;
QParameter *m_shininessParameter;
- QParameter *m_lightPositionParameter;
- QParameter *m_lightIntensityParameter;
QParameter *m_textureScaleParameter;
QTechnique *m_diffuseMapGL3Technique;
QTechnique *m_diffuseMapGL2Technique;
diff --git a/src/render/shaders/es2/diffusemap.frag b/src/render/shaders/es2/diffusemap.frag
index 2a3da64b3..f7fb0fe52 100644
--- a/src/render/shaders/es2/diffusemap.frag
+++ b/src/render/shaders/es2/diffusemap.frag
@@ -1,47 +1,25 @@
#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 ks; // Specular reflectivity
uniform FP float shininess; // Specular shininess factor
+uniform FP vec3 eyePosition;
+
uniform sampler2D diffuseTexture;
varying FP vec3 position;
varying FP vec3 normal;
varying FP vec2 texCoord;
-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 );
-
- // Lookup diffuse color
- FP vec3 diffuseColor = texture2D( diffuseTexture, texCoord ).rgb;
-
- // Combine the ambient, diffuse and specular contributions
- return lightIntensity * ( ( ka + diffuse ) * diffuseColor + ks * specular );
-}
+#pragma include light.inc.frag
void main()
{
- gl_FragColor = vec4( adsModel( position, normalize( normal ) ), 1.0 );
+ FP vec3 diffuseTextureColor = texture2D( diffuseTexture, texCoord ).rgb;
+
+ FP vec3 diffuseColor, specularColor;
+ adsModel(position, normal, eyePosition, shininess, diffuseColor, specularColor);
+
+ gl_FragColor = vec4( diffuseTextureColor * ( ka + diffuseColor ) + ks * specularColor, 1.0 );
}
diff --git a/src/render/shaders/gl3/diffusemap.frag b/src/render/shaders/gl3/diffusemap.frag
index 50dce6eb6..5e6266fd3 100644
--- a/src/render/shaders/gl3/diffusemap.frag
+++ b/src/render/shaders/gl3/diffusemap.frag
@@ -1,14 +1,11 @@
#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 ks; // Specular reflectivity
uniform float shininess; // Specular shininess factor
+uniform vec3 eyePosition;
+
uniform sampler2D diffuseTexture;
in vec3 position;
@@ -17,35 +14,14 @@ in vec2 texCoord;
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 );
-
- // Lookup diffuse color
- vec3 diffuseColor = texture( diffuseTexture, texCoord ).rgb;
-
- // Combine the ambient, diffuse and specular contributions
- return lightIntensity * ( ( ka + diffuse ) * diffuseColor + ks * specular );
-}
+#pragma include light.inc.frag
void main()
{
- fragColor = vec4( adsModel( position, normalize( normal ) ), 1.0 );
- //fragColor = vec4( texCoord.s, texCoord.t, 0.0, 1.0 );
+ vec3 diffuseTextureColor = texture( diffuseTexture, texCoord ).rgb;
+
+ vec3 diffuseColor, specularColor;
+ adsModel(position, normal, eyePosition, shininess, diffuseColor, specularColor);
+
+ fragColor = vec4( diffuseTextureColor * ( ka + diffuseColor ) + ks * specularColor, 1.0 );
}