@@ -39,9 +39,17 @@ uniform vec4 uAmbientColor; // Ambient color
3939uniform vec4 uDiffuseColor; // Diffuse color
4040uniform vec4 uSpecularColor; // Specular color
4141uniform float uSpecularPower; // Specular power
42- uniform vec3 uLightDirWorld; // Directional light (world space).
42+ uniform vec3 uLightDirWorld0; // Directional light (world space).
43+ uniform vec3 uLightDirWorld1; // Directional light (world space).
44+ uniform vec3 uLightDirWorld2; // Directional light (world space).
45+ uniform vec3 uLightDirWorld3; // Directional light (world space).
46+ uniform vec3 uLightColor0; // color of light 0
47+ uniform vec3 uLightColor1; // color of light 1
48+ uniform vec3 uLightColor2; // color of light 2
49+ uniform vec3 uLightColor3; // color of light 3
4350uniform float uTransparency;
4451
52+
4553// clipping planes
4654uniform vec4 uClippingPlane0; // clipping plane 0
4755uniform vec4 uClippingPlane1; // clipping plane 1
@@ -66,8 +74,24 @@ uniform vec4 uFogColor; // fog color
6674// lights we light in world space.
6775varying vec3 vNormal;
6876varying vec4 vColor;
69- varying vec4 vPos;// for clipping plane calc
70- varying vec4 vFogCoord;// for fog calculation
77+ varying vec4 vPos;// for clipping plane calc
78+ varying vec4 vFogCoord;// for fog calculation
79+
80+ vec4 calculate_lighting(vec3 lightDirWorld, vec3 lightColor)
81+ {
82+ vec3 invLightDir = - normalize (lightDirWorld);
83+ vec3 normal = normalize (vNormal);
84+
85+ if (gl_FrontFacing )
86+ normal = - normal;
87+
88+ float diffuse = max (0.0 , dot (normal, invLightDir));
89+ vec3 reflection = reflect (invLightDir, normal);
90+ float specular = max (0.0 , dot (reflection, uCamViewVec));
91+ specular = pow (specular, uSpecularPower);
92+
93+ return vec4 (lightColor * (diffuse * vColor.rgb + specular * uSpecularColor.rgb), 0.0 );
94+ }
7195
7296void main()
7397{
@@ -115,20 +139,15 @@ void main()
115139 discard ;
116140 }
117141
118- vec3 invLightDir = - uLightDirWorld;
119- vec3 normal = normalize (vNormal);
120-
121- if (gl_FrontFacing )
122- normal = - normal;
123-
124- float diffuse = max (0.0 , dot (normal, invLightDir));
125- vec3 reflection = reflect (invLightDir, normal);
126- float specular = max (0.0 , dot (reflection, uCamViewVec));
127- specular = pow (specular, uSpecularPower);
128-
129- vec4 diffuseColor = vColor;
130-
131- gl_FragColor = vec4 ((specular * uSpecularColor + diffuse * diffuseColor + uAmbientColor * diffuseColor).rgb, uTransparency);
142+ gl_FragColor = vec4 (uAmbientColor.rgb * vColor.rgb, uTransparency);
143+ if (length (uLightDirWorld0) > 0.0 )
144+ gl_FragColor += calculate_lighting(uLightDirWorld0, uLightColor0);
145+ if (length (uLightDirWorld1) > 0.0 )
146+ gl_FragColor += calculate_lighting(uLightDirWorld1, uLightColor1);
147+ if (length (uLightDirWorld2) > 0.0 )
148+ gl_FragColor += calculate_lighting(uLightDirWorld2, uLightColor2);
149+ if (length (uLightDirWorld3) > 0.0 )
150+ gl_FragColor += calculate_lighting(uLightDirWorld3, uLightColor3);
132151
133152 // calculate fog
134153 if (uFogSettings.x > 0.0 )
0 commit comments