diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-12-01 14:55:07 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-12-02 11:32:04 +0000 |
commit | 271f58aabed6b2ab5f934de53153db9c3d7f5e9f (patch) | |
tree | 0018b8b71591636e7e26c09f9232f27c8c0117d1 /src/render/shaders/gl3 | |
parent | b8d1f11ce3b9325c592f028aefdc05101eb49c8b (diff) |
Migrate GoochMaterial to be light-aware
On the ES2 path only the first light is taken into account for now.
Change-Id: Ia8974bedddaa43539563149e718284076a519b5e
Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
Diffstat (limited to 'src/render/shaders/gl3')
-rw-r--r-- | src/render/shaders/gl3/gooch.frag | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/src/render/shaders/gl3/gooch.frag b/src/render/shaders/gl3/gooch.frag index 3e141e991..14c4c714a 100644 --- a/src/render/shaders/gl3/gooch.frag +++ b/src/render/shaders/gl3/gooch.frag @@ -1,9 +1,5 @@ #version 150 core -// TODO: Replace with a uniform block -uniform vec4 lightPosition; -uniform vec3 lightIntensity; - // TODO: Replace with a struct uniform vec3 kd; // Diffuse reflectivity uniform vec3 ks; // Specular reflectivity @@ -13,11 +9,15 @@ uniform float alpha; // Fraction of diffuse added to kblue uniform float beta; // Fraction of diffuse added to kyellow uniform float shininess; // Specular shininess factor +uniform vec3 eyePosition; + in vec3 position; in vec3 normal; out vec4 fragColor; +#pragma include light.inc.frag + vec3 goochModel( const in vec3 pos, const in vec3 n ) { // Based upon the original Gooch lighting model paper at: @@ -27,30 +27,35 @@ vec3 goochModel( const in vec3 pos, const in vec3 n ) vec3 kcool = clamp(kblue + alpha * kd, 0.0, 1.0); vec3 kwarm = clamp(kyellow + beta * kd, 0.0, 1.0); - // Calculate the vector from the light to the fragment - vec3 s = normalize( vec3( lightPosition ) - pos ); + vec3 result = vec3(0.0); + int i; + for (i = 0; i < lightCount; ++i) { + // Calculate the vector from the light to the fragment + vec3 s = normalize( vec3( lights[i].position ) - pos ); + + // Calculate the cos theta factor mapped onto the range [0,1] + float sDotNFactor = ( 1.0 + dot( s, n ) ) / 2.0; - // Calculate the cos theta factor mapped onto the range [0,1] - float sDotNFactor = ( 1.0 + dot( s, n ) ) / 2.0; + // Calculate the tone by blending the kcool and kwarm contributions + // as per equation (2) + vec3 intensity = mix( kcool, kwarm, sDotNFactor ); - // Calculate the tone by blending the kcool and kwarm contributions - // as per equation (2) - vec3 intensity = mix( kcool, kwarm, sDotNFactor ); + // Calculate the vector from the fragment to the eye position + vec3 v = normalize( eyePosition - 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 ); - // Reflect the light beam using the normal at this fragment - vec3 r = reflect( -s, n ); + // Calculate the specular component + float specular = 0.0; + if ( dot( s, n ) > 0.0 ) + specular = pow( max( dot( r, v ), 0.0 ), shininess ); - // Calculate the specular component - float specular = 0.0; - if ( dot( s, n ) > 0.0 ) - specular = pow( max( dot( r, v ), 0.0 ), shininess ); + // Sum the blended tone and specular highlight + result += intensity + ks * specular; + } - // Sum the blended tone and specular highlight - return intensity + ks * specular; + return result; } void main() |