summaryrefslogtreecommitdiffstats
path: root/shader
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2009-12-21 23:41:17 +0100
committerMatthias Schiffer <matthias@gamezock.de>2009-12-21 23:41:17 +0100
commitb7cb3463543b01e8faa13c01bcee17c44beba586 (patch)
tree41302034664ea05f8d4b799856e4acd5cabcc3b9 /shader
parenta540d6b16743dad657fd2d6220efea51b56e1f1d (diff)
downloadzoom++-b7cb3463543b01e8faa13c01bcee17c44beba586.tar
zoom++-b7cb3463543b01e8faa13c01bcee17c44beba586.zip
Optimized shaders
Diffstat (limited to 'shader')
-rw-r--r--shader/light.frag30
-rw-r--r--shader/light.vert2
2 files changed, 15 insertions, 17 deletions
diff --git a/shader/light.frag b/shader/light.frag
index c3cdbfb..340b459 100644
--- a/shader/light.frag
+++ b/shader/light.frag
@@ -7,33 +7,31 @@ varying vec3 normal, pos;
void main() {
vec3 n, l, refl, eye;
float NdotL, RdotE;
- vec4 color, specularColor;
- float dist, att, specularFactor;
+ vec4 specularColor;
+ float dist, distSq, att, specularFactor;
n = normalize(normal);
l = gl_LightSource[0].position.xyz - pos;
- dist = length(l);
- l /= dist;
+ distSq = dot(l, l);
- /* compute the dot product between normal and normalized lightdir */
- NdotL = max(dot(n, l), 0.0);
+ NdotL = dot(n, l);
if (NdotL > 0.0) {
- att = 1.0 / (gl_LightSource[0].constantAttenuation +
- gl_LightSource[0].linearAttenuation * dist +
- gl_LightSource[0].quadraticAttenuation * dist * dist);
- color = att * (diffuse * NdotL + ambient);
+ dist = sqrt(distSq);
- refl = normalize(reflect(-l, n));
- eye = normalize(-pos);
+ att = 1.0 / (gl_LightSource[0].quadraticAttenuation * distSq);
+ gl_FragColor = att * (diffuse * NdotL / dist + ambient) * texture2D(tex, gl_TexCoord[0].st);
- RdotE = max(dot(refl, eye), 0.0);
- specularFactor = att * pow(RdotE, gl_FrontMaterial.shininess);
- specularColor = specularFactor * gl_FrontMaterial.specular * gl_LightSource[0].specular;
+ refl = reflect(-l, n);
- gl_FragColor = color * texture2D(tex, gl_TexCoord[0].st) + specularColor;
+ RdotE = -dot(refl, pos) / sqrt(dot(refl, refl) * dot(pos, pos));
+
+ if(RdotE > 0.0) {
+ specularFactor = att * pow(RdotE, gl_FrontMaterial.shininess);
+ gl_FragColor += specularFactor * gl_FrontMaterial.specular * gl_LightSource[0].specular;
+ }
}
else {
gl_FragColor = vec4(0, 0, 0, 1);
diff --git a/shader/light.vert b/shader/light.vert
index b97da78..2faa1c0 100644
--- a/shader/light.vert
+++ b/shader/light.vert
@@ -3,7 +3,7 @@ varying vec3 normal, pos;
void main() {
- normal = normalize(gl_NormalMatrix * gl_Normal);
+ normal = gl_NormalMatrix * gl_Normal;
pos = vec3(gl_ModelViewMatrix * gl_Vertex);