diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-12-01 13:21:39 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-12-02 11:31:53 +0000 |
commit | 705f5dd781a1e34db429edbfe133842eea16a82b (patch) | |
tree | 351c44a3910c334eb563e9de777161523d1cb6e9 | |
parent | ff67c813fcd377d704bcb9d37b03546797be6193 (diff) |
Migrate DiffuseSpecularMapMaterial to be light-aware
Change-Id: I692e7ad9cdd63c2098e799c41937b2a4440f9c70
Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
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 ); } |