summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-12-01 13:21:39 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-12-02 11:31:53 +0000
commit705f5dd781a1e34db429edbfe133842eea16a82b (patch)
tree351c44a3910c334eb563e9de777161523d1cb6e9
parentff67c813fcd377d704bcb9d37b03546797be6193 (diff)
Migrate DiffuseSpecularMapMaterial to be light-aware
Change-Id: I692e7ad9cdd63c2098e799c41937b2a4440f9c70 Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
-rw-r--r--src/quick3d/imports/render/defaults/qml/DiffuseSpecularMapMaterial.qml6
-rw-r--r--src/render/defaults/qdiffusespecularmapmaterial.cpp4
-rw-r--r--src/render/defaults/qdiffusespecularmapmaterial_p.h2
-rw-r--r--src/render/shaders/es2/diffusespecularmap.frag41
-rw-r--r--src/render/shaders/gl3/diffusespecularmap.frag42
5 files changed, 20 insertions, 75 deletions
diff --git a/src/quick3d/imports/render/defaults/qml/DiffuseSpecularMapMaterial.qml b/src/quick3d/imports/render/defaults/qml/DiffuseSpecularMapMaterial.qml
index b05acdb8f..919805a2e 100644
--- a/src/quick3d/imports/render/defaults/qml/DiffuseSpecularMapMaterial.qml
+++ b/src/quick3d/imports/render/defaults/qml/DiffuseSpecularMapMaterial.qml
@@ -82,12 +82,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/diffusespecularmap.vert")
diff --git a/src/render/defaults/qdiffusespecularmapmaterial.cpp b/src/render/defaults/qdiffusespecularmapmaterial.cpp
index 746739ed3..44c507859 100644
--- a/src/render/defaults/qdiffusespecularmapmaterial.cpp
+++ b/src/render/defaults/qdiffusespecularmapmaterial.cpp
@@ -66,8 +66,6 @@ QDiffuseSpecularMapMaterialPrivate::QDiffuseSpecularMapMaterialPrivate()
, m_diffuseParameter(new QParameter(QStringLiteral("diffuseTexture"), m_diffuseTexture))
, m_specularParameter(new QParameter(QStringLiteral("specularTexture"), m_specularTexture))
, m_shininessParameter(new QParameter(QStringLiteral("shininess"), 150.0f))
- , m_lightPositionParameter(new QParameter(QStringLiteral("lightPosition"), QVector4D(1.0f, 1.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_diffuseSpecularMapGL3Technique(new QTechnique())
, m_diffuseSpecularMapGL2Technique(new QTechnique())
@@ -129,8 +127,6 @@ void QDiffuseSpecularMapMaterialPrivate::init()
m_diffuseSpecularMapEffect->addParameter(m_diffuseParameter);
m_diffuseSpecularMapEffect->addParameter(m_specularParameter);
m_diffuseSpecularMapEffect->addParameter(m_shininessParameter);
- m_diffuseSpecularMapEffect->addParameter(m_lightPositionParameter);
- m_diffuseSpecularMapEffect->addParameter(m_lightIntensityParameter);
m_diffuseSpecularMapEffect->addParameter(m_textureScaleParameter);
q_func()->setEffect(m_diffuseSpecularMapEffect);
diff --git a/src/render/defaults/qdiffusespecularmapmaterial_p.h b/src/render/defaults/qdiffusespecularmapmaterial_p.h
index 8d049305c..c3fbbe44e 100644
--- a/src/render/defaults/qdiffusespecularmapmaterial_p.h
+++ b/src/render/defaults/qdiffusespecularmapmaterial_p.h
@@ -78,8 +78,6 @@ public:
QParameter *m_diffuseParameter;
QParameter *m_specularParameter;
QParameter *m_shininessParameter;
- QParameter *m_lightPositionParameter;
- QParameter *m_lightIntensityParameter;
QParameter *m_textureScaleParameter;
QTechnique *m_diffuseSpecularMapGL3Technique;
QTechnique *m_diffuseSpecularMapGL2Technique;
diff --git a/src/render/shaders/es2/diffusespecularmap.frag b/src/render/shaders/es2/diffusespecularmap.frag
index 419bdd30a..cc7785fd8 100644
--- a/src/render/shaders/es2/diffusespecularmap.frag
+++ b/src/render/shaders/es2/diffusespecularmap.frag
@@ -1,12 +1,11 @@
#define FP highp
-uniform FP vec4 lightPosition;
-uniform FP vec3 lightIntensity;
-
// TODO: Replace with a struct
uniform FP vec3 ka; // Ambient reflectivity
uniform FP float shininess; // Specular shininess factor
+uniform FP vec3 eyePosition;
+
uniform sampler2D diffuseTexture;
uniform sampler2D specularTexture;
@@ -14,35 +13,15 @@ varying FP vec3 position;
varying FP vec3 normal;
varying FP vec2 texCoord;
-FP vec3 adsModel( const in FP vec3 pos, const in 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 = ( shininess / ( 8.0 * 3.14 ) ) * pow( max( dot( r, v ), 0.0 ), shininess );
-
- // Lookup diffuse and specular factors
- FP vec3 diffuseColor = texture2D( diffuseTexture, texCoord ).rgb;
- FP vec3 specularColor = texture2D( specularTexture, texCoord ).rgb;
-
- // Combine the ambient, diffuse and specular contributions
- return lightIntensity * ( ( ka + diffuse ) * diffuseColor + specular * specularColor );
-}
+#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 specularTextureColor = texture2D( specularTexture, texCoord ).rgb;
+
+ FP vec3 diffuseColor, specularColor;
+ adsModel(position, normal, eyePosition, shininess, diffuseColor, specularColor);
+
+ gl_FragColor = vec4( diffuseTextureColor * ( ka + diffuseColor ) + specularTextureColor * specularColor, 1.0 );
}
diff --git a/src/render/shaders/gl3/diffusespecularmap.frag b/src/render/shaders/gl3/diffusespecularmap.frag
index b8c7535ac..98ef53040 100644
--- a/src/render/shaders/gl3/diffusespecularmap.frag
+++ b/src/render/shaders/gl3/diffusespecularmap.frag
@@ -1,13 +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 float shininess; // Specular shininess factor
+uniform vec3 eyePosition;
+
uniform sampler2D diffuseTexture;
uniform sampler2D specularTexture;
@@ -17,35 +15,15 @@ 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 = ( shininess / ( 8.0 * 3.14 ) ) * pow( max( dot( r, v ), 0.0 ), shininess );
-
- // Lookup diffuse and specular factors
- vec3 diffuseColor = texture( diffuseTexture, texCoord ).rgb;
- vec3 specularColor = texture( specularTexture, texCoord ).rgb;
-
- // Combine the ambient, diffuse and specular contributions
- return lightIntensity * ( ( ka + diffuse ) * diffuseColor + specular * specularColor );
-}
+#pragma include light.inc.frag
void main()
{
- fragColor = vec4( adsModel( position, normalize( normal ) ), 1.0 );
+ vec3 diffuseTextureColor = texture( diffuseTexture, texCoord ).rgb;
+ vec3 specularTextureColor = texture( specularTexture, texCoord ).rgb;
+
+ vec3 diffuseColor, specularColor;
+ adsModel(position, normal, eyePosition, shininess, diffuseColor, specularColor);
+
+ fragColor = vec4( diffuseTextureColor * ( ka + diffuseColor ) + specularTextureColor * specularColor, 1.0 );
}