Use multi-pass rendering with seperate ambient and light shaders

This commit is contained in:
Matthias Schiffer 2009-12-18 13:31:07 +01:00
parent b3b74dc2af
commit 4e3efa239c
10 changed files with 148 additions and 48 deletions

8
shader/ambient.frag Normal file
View file

@ -0,0 +1,8 @@
uniform sampler2D tex;
varying vec4 ambient;
void main() {
gl_FragColor = ambient * texture2D(tex, gl_TexCoord[0].st);
}

8
shader/ambient.vert Normal file
View file

@ -0,0 +1,8 @@
varying vec4 ambient;
void main() {
ambient = gl_LightModel.ambient * gl_FrontMaterial.ambient;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}

View file

@ -1,6 +1,6 @@
uniform sampler2D tex;
varying vec4 diffuse, ambientGlobal, ambient;
varying vec4 diffuse, ambient;
varying vec3 normal, pos;
@ -10,8 +10,6 @@ void main() {
vec4 color, specularColor;
float dist, att, specularFactor;
color = ambientGlobal;
n = normalize(normal);
l = gl_LightSource[0].position.xyz - pos;
@ -26,7 +24,7 @@ void main() {
att = 1.0 / (gl_LightSource[0].constantAttenuation +
gl_LightSource[0].linearAttenuation * dist +
gl_LightSource[0].quadraticAttenuation * dist * dist);
color += att * (diffuse * NdotL + ambient);
color = att * (diffuse * NdotL + ambient);
refl = normalize(reflect(-l, n));
eye = normalize(-pos);
@ -34,10 +32,10 @@ void main() {
RdotE = max(dot(refl, eye), 0.0);
specularFactor = att * pow(RdotE, gl_FrontMaterial.shininess);
specularColor = specularFactor * gl_FrontMaterial.specular * gl_LightSource[0].specular;
gl_FragColor = color * texture2D(tex, gl_TexCoord[0].st) + specularColor;
}
else {
specularColor = vec4(0, 0, 0, 1);
gl_FragColor = vec4(0, 0, 0, 1);
}
gl_FragColor = color * texture2D(tex, gl_TexCoord[0].st) + specularColor;
}

View file

@ -1,4 +1,4 @@
varying vec4 diffuse, ambientGlobal, ambient;
varying vec4 diffuse, ambient;
varying vec3 normal, pos;
@ -10,7 +10,6 @@ void main() {
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();