1 // precision highp float;
5 varying vec4 diffuseColor;
6 varying vec3 ambientColor;
8 uniform vec4 matDiffuse;
9 uniform vec3 matAmbient;
13 varying vec3 tTangent1;
14 varying vec3 tTangent2;
17 #if ENVIRONMENT_MAPPING || LIGHTING_ON
18 varying vec3 nnEyeToSurface;
24 uniform vec3 matSpecular;
25 uniform float matPower;
28 uniform vec3 matEmissive;
31 uniform vec3 lightsPos[NUM_LIGHTS];
32 uniform vec3 lightsAtt[NUM_LIGHTS];
34 uniform vec3 lightsSpotDir[NUM_LIGHTS];
35 uniform float lightsSpotCutOffCos[NUM_LIGHTS];
36 uniform float lightsSpotExp[NUM_LIGHTS];
38 uniform vec3 lightsDiffuse[NUM_LIGHTS];
39 uniform vec3 lightsAmbient[NUM_LIGHTS];
40 uniform vec3 lightsSpecular[NUM_LIGHTS];
42 uniform vec3 globalAmbient;
43 #elif PER_VERTEX_COLOR
46 uniform vec4 matDiffuse;
49 #if ENVIRONMENT_MAPPING
50 uniform samplerCube envTex;
51 uniform mat3 cubemap_matrix;
53 #if ENVIRONMENT_REFLECTION
54 uniform float matReflectivity;
57 #if ENVIRONMENT_MAPPING
58 uniform float matRefractionETA;
63 #if TEXTURE_ON || NORMALS_MAPPING || SPECULAR_MAPPING || REFLECTION_MAP || CUBEMAP_ON
66 uniform sampler2D specularTex;
70 uniform samplerCube diffuseTex;
71 varying vec3 fTexCoord;
73 varying vec2 fTexCoord;
77 uniform sampler2D diffuseTex;
81 uniform sampler2D bumpTex;
85 uniform sampler2D reflectTex;
89 uniform mat4 texture_matrix;
94 uniform vec3 fogColor;
99 void computeLight(vec3 light, vec3 n, vec3 eye, inout vec3 ambient, inout vec3 diffuse, inout vec3 specular,
100 bool isPositional, bool isSpot, bool doAttenuation, vec3 spotDir, float spotCutOffCos, float spotExp, vec3 att,
101 vec3 lightAmbient, vec3 lightDiffuse, vec3 lightSpecular)
103 float nDotL, attenuation = 1.0;
110 if(isPositional && doAttenuation)
116 l = normalize(light);
118 if(isPositional && isSpot)
120 float spotDot = dot(l, spotDir);
121 attenuation = (spotDot < spotCutOffCos) ? 0.0 : pow(max(0.0, spotDot), spotExp);
124 nDotL = max(0.0, dot(n, l));
126 if(isPositional && doAttenuation)
127 attenuation /= (att.x + att.y * d + att.z * d * d);
131 #if LIGHTING_SPECULAR_BLINN
132 float nDotHV = dot(n, normalize(l + eye));
135 float nDotHV = dot(reflect(-l, n), eye);
137 pf = pow(max(0.0, nDotHV), matPower);
141 ambient += lightAmbient * attenuation;
142 diffuse += lightDiffuse * attenuation * nDotL;
144 specular += lightSpecular * attenuation * pf;
156 texCoord = (vec4(fTexCoord, 1) * texture_matrix).xyz;
158 texCoord = fTexCoord;
162 #if NORMALS_MAPPING || TEXTURE_ON || SPECULAR_MAPPING || REFLECTION_MAP
165 texCoord = (vec4(fTexCoord, 0, 1) * texture_matrix).xy;
167 texCoord = fTexCoord;
171 #if LIGHTING_ON || ENVIRONMENT_MAPPING
175 #if LIGHTING_ON && !PER_VERTEX_COLOR
176 vec4 diffuseColor = matDiffuse;
177 vec3 ambientColor = matAmbient;
180 #if ENVIRONMENT_MAPPING || (LIGHTING_ON && !NON_LOCAL_VIEWER && MAT_SPECULAR)
181 vec3 eyeToSurface = normalize(nnEyeToSurface);
185 vec3 lights[NUM_LIGHTS];
186 vec3 diffuse = vec3(0), ambient = vec3(0), specular = vec3(0);
188 #if !NON_LOCAL_VIEWER && MAT_SPECULAR
189 vec3 lEye = -eyeToSurface;
191 vec3 lEye = vec3(0.0, 0.0, 1.0);
195 mat3 tbn = mat3(normalize(tTangent1), normalize(tTangent2), normalize(tNormal));
196 n = tbn * (2.0 * vec3(texture2D(bumpTex, texCoord)) - 1.0);
197 // n = tbn * (2.0 * vec3(0.5, 0.5, 1.0) - 1.0);
199 n = normalize(tNormal);
202 #if NUM_LIGHTS > 0 && LIGHT0_ON && LIGHT0_POSITIONAL
203 lights[0] = lightsPos[0] - nnEyeToSurface;
205 #if NUM_LIGHTS > 1 && LIGHT1_ON && LIGHT1_POSITIONAL
206 lights[1] = lightsPos[1] - nnEyeToSurface;
208 #if NUM_LIGHTS > 2 && LIGHT2_ON && LIGHT2_POSITIONAL
209 lights[2] = lightsPos[2] - nnEyeToSurface;
211 #if NUM_LIGHTS > 3 && LIGHT3_ON && LIGHT3_POSITIONAL
212 lights[3] = lightsPos[3] - nnEyeToSurface;
214 #if NUM_LIGHTS > 4 && LIGHT4_ON && LIGHT4_POSITIONAL
215 lights[4] = lightsPos[4] - nnEyeToSurface;
217 #if NUM_LIGHTS > 5 && LIGHT5_ON && LIGHT5_POSITIONAL
218 lights[5] = lightsPos[5] - nnEyeToSurface;
220 #if NUM_LIGHTS > 6 && LIGHT6_ON && LIGHT6_POSITIONAL
221 lights[6] = lightsPos[6] - nnEyeToSurface;
223 #if NUM_LIGHTS > 7 && LIGHT7_ON && LIGHT7_POSITIONAL
224 lights[7] = lightsPos[7] - nnEyeToSurface;
228 if(!gl_FrontFacing) n = -n;
231 #if NUM_LIGHTS > 0 && LIGHT0_ON
232 computeLight(bool(LIGHT0_POSITIONAL) ? lights[0] : lightsPos[0], n, lEye, ambient, diffuse, specular,
233 bool(LIGHT0_POSITIONAL), bool(LIGHT0_SPOT), bool(LIGHT0_ATT),
234 bool(LIGHT0_SPOT) ? lightsSpotDir[0] : vec3(0), bool(LIGHT0_SPOT) ? lightsSpotCutOffCos[0] : 0.0, bool(LIGHT0_SPOT) ? lightsSpotExp[0] : 0.0,
235 bool(LIGHT0_ATT) ? lightsAtt[0] : vec3(1,0,0),
236 lightsAmbient[0], lightsDiffuse[0], lightsSpecular[0]);
238 #if NUM_LIGHTS > 1 && LIGHT1_ON
239 computeLight(bool(LIGHT1_POSITIONAL) ? lights[1] : lightsPos[1], n, lEye, ambient, diffuse, specular,
240 bool(LIGHT1_POSITIONAL), bool(LIGHT1_SPOT), bool(LIGHT1_ATT),
241 bool(LIGHT1_SPOT) ? lightsSpotDir[1] : vec3(0), bool(LIGHT1_SPOT) ? lightsSpotCutOffCos[1] : 0.0, bool(LIGHT1_SPOT) ? lightsSpotExp[1] : 0.0,
242 bool(LIGHT1_ATT) ? lightsAtt[1] : vec3(1,0,0),
243 lightsAmbient[1], lightsDiffuse[1], lightsSpecular[1]);
245 #if NUM_LIGHTS > 2 && LIGHT2_ON
246 computeLight(bool(LIGHT2_POSITIONAL) ? lights[2] : lightsPos[2], n, lEye, ambient, diffuse, specular,
247 bool(LIGHT2_POSITIONAL), bool(LIGHT2_SPOT), bool(LIGHT2_ATT),
248 bool(LIGHT2_SPOT) ? lightsSpotDir[2] : vec3(0), bool(LIGHT2_SPOT) ? lightsSpotCutOffCos[2] : 0.0, bool(LIGHT2_SPOT) ? lightsSpotExp[2] : 0.0,
249 bool(LIGHT2_ATT) ? lightsAtt[2] : vec3(1,0,0),
250 lightsAmbient[2], lightsDiffuse[2], lightsSpecular[2]);
252 #if NUM_LIGHTS > 3 && LIGHT3_ON
253 computeLight(bool(LIGHT3_POSITIONAL) ? lights[3] : lightsPos[3], n, lEye, ambient, diffuse, specular,
254 bool(LIGHT3_POSITIONAL), bool(LIGHT3_SPOT), bool(LIGHT3_ATT),
255 bool(LIGHT3_SPOT) ? lightsSpotDir[3] : vec3(0), bool(LIGHT3_SPOT) ? lightsSpotCutOffCos[3] : 0.0, bool(LIGHT3_SPOT) ? lightsSpotExp[3] : 0.0,
256 bool(LIGHT3_ATT) ? lightsAtt[3] : vec3(1,0,0),
257 lightsAmbient[3], lightsDiffuse[3], lightsSpecular[3]);
259 #if NUM_LIGHTS > 4 && LIGHT4_ON
260 computeLight(bool(LIGHT4_POSITIONAL) ? lights[4] : lightsPos[4], n, lEye, ambient, diffuse, specular,
261 bool(LIGHT4_POSITIONAL), bool(LIGHT4_SPOT), bool(LIGHT4_ATT),
262 bool(LIGHT4_SPOT) ? lightsSpotDir[4] : vec3(0), bool(LIGHT4_SPOT) ? lightsSpotCutOffCos[4] : 0.0, bool(LIGHT4_SPOT) ? lightsSpotExp[4] : 0.0,
263 bool(LIGHT4_ATT) ? lightsAtt[4] : vec3(1,0,0),
264 lightsAmbient[4], lightsDiffuse[4], lightsSpecular[4]);
266 #if NUM_LIGHTS > 5 && LIGHT5_ON
267 computeLight(bool(LIGHT5_POSITIONAL) ? lights[5] : lightsPos[5], n, lEye, ambient, diffuse, specular,
268 bool(LIGHT5_POSITIONAL), bool(LIGHT5_SPOT), bool(LIGHT5_ATT),
269 bool(LIGHT5_SPOT) ? lightsSpotDir[5] : vec3(0), bool(LIGHT5_SPOT) ? lightsSpotCutOffCos[5] : 0.0, bool(LIGHT5_SPOT) ? lightsSpotExp[5] : 0.0,
270 bool(LIGHT5_ATT) ? lightsAtt[5] : vec3(1,0,0),
271 lightsAmbient[5], lightsDiffuse[5], lightsSpecular[5]);
273 #if NUM_LIGHTS > 6 && LIGHT6_ON
274 computeLight(bool(LIGHT6_POSITIONAL) ? lights[6] : lightsPos[6], n, lEye, ambient, diffuse, specular,
275 bool(LIGHT6_POSITIONAL), bool(LIGHT6_SPOT), bool(LIGHT6_ATT),
276 bool(LIGHT6_SPOT) ? lightsSpotDir[6] : vec3(0), bool(LIGHT6_SPOT) ? lightsSpotCutOffCos[6] : 0.0, bool(LIGHT6_SPOT) ? lightsSpotExp[6] : 0.0,
277 bool(LIGHT6_ATT) ? lightsAtt[6] : vec3(1,0,0),
278 lightsAmbient[6], lightsDiffuse[6], lightsSpecular[6]);
280 #if NUM_LIGHTS > 7 && LIGHT7_ON
281 computeLight(bool(LIGHT7_POSITIONAL) ? lights[7] : lightsPos[7], n, lEye, ambient, diffuse, specular,
282 bool(LIGHT7_POSITIONAL), bool(LIGHT7_SPOT), bool(LIGHT7_ATT),
283 bool(LIGHT7_SPOT) ? lightsSpotDir[7] : vec3(0), bool(LIGHT7_SPOT) ? lightsSpotCutOffCos[7] : 0.0, bool(LIGHT7_SPOT) ? lightsSpotExp[7] : 0.0,
284 bool(LIGHT7_ATT) ? lightsAtt[7] : vec3(1,0,0),
285 lightsAmbient[7], lightsDiffuse[7], lightsSpecular[7]);
288 #if MAT_SPECULAR && SPECULAR_MAPPING
289 vec3 specTexel = vec3(texture2D(specularTex, texCoord));
290 specular *= vec3(specTexel.r, specTexel.r, specTexel.r);
293 c = vec4(min(vec3(1.0),
294 ambientColor * (ambient + globalAmbient) + diffuseColor.xyz * diffuse + matEmissive
295 #if MAT_SPECULAR && !MAT_SEPARATE_SPECULAR
296 + matSpecular * specular
300 #elif PER_VERTEX_COLOR
308 texel = texture2D(diffuseTex, texCoord);
310 texel = vec4(1,1,1,texel.a);
312 texel = vec4(1,1,1,texel.r);
317 texel = textureCube(diffuseTex, texCoord);
319 texel = vec4(1,1,1,texel.a);
321 texel = vec4(1,1,1,texel.r);
326 #if ENVIRONMENT_MAPPING
328 #if ENVIRONMENT_REFRACTION
331 v = refract(eyeToSurface, n, matRefractionETA);
332 c = vec4(opacity * c + (1.0 - opacity) * textureCube(envTex, vec3(cubemap_matrix * v)));
336 #if ENVIRONMENT_REFLECTION
338 float reflectivity = matReflectivity;
340 reflectivity *= texture2D(reflectTex, texCoord).r;
342 v = reflect(eyeToSurface, n);
343 c = (1.0 - reflectivity) * c + reflectivity * textureCube(envTex, vec3(cubemap_matrix * v));
348 #if LIGHTING_ON && MAT_SPECULAR && MAT_SEPARATE_SPECULAR
349 c = min(vec4(1.0), vec4(vec3(c) + matSpecular * specular, 1.0));
354 float fog = clamp(exp(fogZ), 0.0, 1.0);
355 c = vec4(fog * c.xyz + (1.0 - fog) * fogColor, c.w);
359 #ifdef LIMITED_COLORS
360 #define LIMITED_MULTIPLIER 10.0
361 #define LIMITED_MODULO 2.0
363 c.x -= mod(c.x * LIMITED_MULTIPLIER, LIMITED_MODULO) / LIMITED_MULTIPLIER;
364 c.y -= mod(c.y * LIMITED_MULTIPLIER, LIMITED_MODULO) / LIMITED_MULTIPLIER;
365 c.z -= mod(c.z * LIMITED_MULTIPLIER, LIMITED_MODULO) / LIMITED_MULTIPLIER;
369 //c = vec4(0.5 * (n + 1.0), 1.0);
372 //c = vec4(0.5 * (normalize(-tNormal) + 1.0), 1.0);
373 //c = vec4(0.5 * (normalize(tTangent1) + 1.0), 1.0);
374 //c = vec4(0.5 * (normalize(tTangent2) + 1.0), 1.0);
377 //c = vec4(vec3(c), 0.5);
380 //c = vec4((vec3(n.x + 1.0, n.y + 1.0, n.z + 1.0) / 2.0), 1.0);
381 //c = texture2D(bumpTex, fTexCoord);
383 #if TEXTURE_ON || NORMALS_MAPPING || SPECULAR_MAPPING || REFLECTION_MAP
384 //c = vec4(texCoord.x, texCoord.y, 0.0, 1.0);
389 #if !NON_LOCAL_VIEWER
390 //c = vec4((vec3(0.0, eyeToSurface.y + 1.0, 0.0) / 2.0), 1.0);
392 //c = vec4((n / 2.0) + vec3(0.5), 1.0);
394 #if ENVIRONMENT_MAPPING
395 // c = vec4((v / 2.0) + vec3(0.5), 1.0);