diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-11-30 19:12:51 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-12-01 14:05:44 +0000 |
commit | d763a69c9c2e55f7d358c538335ebf5c62cb5445 (patch) | |
tree | 9633975093a3d814ff82185fa612d8278096cd2f | |
parent | bfdaeb1877ec05f7c19eac646358eaf1acddc2eb (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.qml | 6 | ||||
-rw-r--r-- | src/render/defaults/qdiffusemapmaterial.cpp | 4 | ||||
-rw-r--r-- | src/render/defaults/qdiffusemapmaterial_p.h | 2 | ||||
-rw-r--r-- | src/render/shaders/es2/diffusemap.frag | 40 | ||||
-rw-r--r-- | src/render/shaders/gl3/diffusemap.frag | 42 |
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 ); } |