1 2uniform float m_Shininess; 3uniform vec4 g_LightDirection; 4 5varying vec4 AmbientSum; 6varying vec4 DiffuseSum; 7varying vec4 SpecularSum; 8 9varying vec3 vNormal; 10varying vec2 texCoord; 11varying vec3 vPosition; 12varying vec3 vnPosition; 13varying vec3 vViewDir; 14varying vec4 vLightDir; 15varying vec4 vnLightDir; 16varying vec3 lightVec; 17 18 19#ifdef DIFFUSEMAP 20 uniform sampler2D m_DiffuseMap; 21#endif 22#ifdef DIFFUSEMAP_1 23 uniform sampler2D m_DiffuseMap_1; 24#endif 25#ifdef DIFFUSEMAP_2 26 uniform sampler2D m_DiffuseMap_2; 27#endif 28#ifdef DIFFUSEMAP_3 29 uniform sampler2D m_DiffuseMap_3; 30#endif 31#ifdef DIFFUSEMAP_4 32 uniform sampler2D m_DiffuseMap_4; 33#endif 34#ifdef DIFFUSEMAP_5 35 uniform sampler2D m_DiffuseMap_5; 36#endif 37#ifdef DIFFUSEMAP_6 38 uniform sampler2D m_DiffuseMap_6; 39#endif 40#ifdef DIFFUSEMAP_7 41 uniform sampler2D m_DiffuseMap_7; 42#endif 43#ifdef DIFFUSEMAP_8 44 uniform sampler2D m_DiffuseMap_8; 45#endif 46#ifdef DIFFUSEMAP_9 47 uniform sampler2D m_DiffuseMap_9; 48#endif 49#ifdef DIFFUSEMAP_10 50 uniform sampler2D m_DiffuseMap_10; 51#endif 52#ifdef DIFFUSEMAP_11 53 uniform sampler2D m_DiffuseMap_11; 54#endif 55 56 57#ifdef DIFFUSEMAP_0_SCALE 58 uniform float m_DiffuseMap_0_scale; 59#endif 60#ifdef DIFFUSEMAP_1_SCALE 61 uniform float m_DiffuseMap_1_scale; 62#endif 63#ifdef DIFFUSEMAP_2_SCALE 64 uniform float m_DiffuseMap_2_scale; 65#endif 66#ifdef DIFFUSEMAP_3_SCALE 67 uniform float m_DiffuseMap_3_scale; 68#endif 69#ifdef DIFFUSEMAP_4_SCALE 70 uniform float m_DiffuseMap_4_scale; 71#endif 72#ifdef DIFFUSEMAP_5_SCALE 73 uniform float m_DiffuseMap_5_scale; 74#endif 75#ifdef DIFFUSEMAP_6_SCALE 76 uniform float m_DiffuseMap_6_scale; 77#endif 78#ifdef DIFFUSEMAP_7_SCALE 79 uniform float m_DiffuseMap_7_scale; 80#endif 81#ifdef DIFFUSEMAP_8_SCALE 82 uniform float m_DiffuseMap_8_scale; 83#endif 84#ifdef DIFFUSEMAP_9_SCALE 85 uniform float m_DiffuseMap_9_scale; 86#endif 87#ifdef DIFFUSEMAP_10_SCALE 88 uniform float m_DiffuseMap_10_scale; 89#endif 90#ifdef DIFFUSEMAP_11_SCALE 91 uniform float m_DiffuseMap_11_scale; 92#endif 93 94 95#ifdef ALPHAMAP 96 uniform sampler2D m_AlphaMap; 97#endif 98#ifdef ALPHAMAP_1 99 uniform sampler2D m_AlphaMap_1; 100#endif 101#ifdef ALPHAMAP_2 102 uniform sampler2D m_AlphaMap_2; 103#endif 104 105#ifdef NORMALMAP 106 uniform sampler2D m_NormalMap; 107#endif 108#ifdef NORMALMAP_1 109 uniform sampler2D m_NormalMap_1; 110#endif 111#ifdef NORMALMAP_2 112 uniform sampler2D m_NormalMap_2; 113#endif 114#ifdef NORMALMAP_3 115 uniform sampler2D m_NormalMap_3; 116#endif 117#ifdef NORMALMAP_4 118 uniform sampler2D m_NormalMap_4; 119#endif 120#ifdef NORMALMAP_5 121 uniform sampler2D m_NormalMap_5; 122#endif 123#ifdef NORMALMAP_6 124 uniform sampler2D m_NormalMap_6; 125#endif 126#ifdef NORMALMAP_7 127 uniform sampler2D m_NormalMap_7; 128#endif 129#ifdef NORMALMAP_8 130 uniform sampler2D m_NormalMap_8; 131#endif 132#ifdef NORMALMAP_9 133 uniform sampler2D m_NormalMap_9; 134#endif 135#ifdef NORMALMAP_10 136 uniform sampler2D m_NormalMap_10; 137#endif 138#ifdef NORMALMAP_11 139 uniform sampler2D m_NormalMap_11; 140#endif 141 142 143#ifdef TRI_PLANAR_MAPPING 144 varying vec4 wVertex; 145 varying vec3 wNormal; 146#endif 147 148 149 150float tangDot(in vec3 v1, in vec3 v2){ 151 float d = dot(v1,v2); 152 #ifdef V_TANGENT 153 d = 1.0 - d*d; 154 return step(0.0, d) * sqrt(d); 155 #else 156 return d; 157 #endif 158} 159 160 161float lightComputeDiffuse(in vec3 norm, in vec3 lightdir, in vec3 viewdir){ 162 return max(0.0, dot(norm, lightdir)); 163} 164 165float lightComputeSpecular(in vec3 norm, in vec3 viewdir, in vec3 lightdir, in float shiny){ 166 #ifdef WARDISO 167 // Isotropic Ward 168 vec3 halfVec = normalize(viewdir + lightdir); 169 float NdotH = max(0.001, tangDot(norm, halfVec)); 170 float NdotV = max(0.001, tangDot(norm, viewdir)); 171 float NdotL = max(0.001, tangDot(norm, lightdir)); 172 float a = tan(acos(NdotH)); 173 float p = max(shiny/128.0, 0.001); 174 return NdotL * (1.0 / (4.0*3.14159265*p*p)) * (exp(-(a*a)/(p*p)) / (sqrt(NdotV * NdotL))); 175 #else 176 // Standard Phong 177 vec3 R = reflect(-lightdir, norm); 178 return pow(max(tangDot(R, viewdir), 0.0), shiny); 179 #endif 180} 181 182vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 wvLightDir){ 183 float diffuseFactor = lightComputeDiffuse(wvNorm, wvLightDir, wvViewDir); 184 float specularFactor = lightComputeSpecular(wvNorm, wvViewDir, wvLightDir, m_Shininess); 185 specularFactor *= step(1.0, m_Shininess); 186 187 float att = vLightDir.w; 188 189 return vec2(diffuseFactor, specularFactor) * vec2(att); 190} 191 192 193#ifdef ALPHAMAP 194 195 vec4 calculateDiffuseBlend(in vec2 texCoord) { 196 vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); 197 198 #ifdef ALPHAMAP_1 199 vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); 200 #endif 201 #ifdef ALPHAMAP_2 202 vec4 alphaBlend2 = texture2D( m_AlphaMap_2, texCoord.xy ); 203 #endif 204 205 vec4 diffuseColor = texture2D(m_DiffuseMap, texCoord * m_DiffuseMap_0_scale); 206 diffuseColor *= alphaBlend.r; 207 #ifdef DIFFUSEMAP_1 208 vec4 diffuseColor1 = texture2D(m_DiffuseMap_1, texCoord * m_DiffuseMap_1_scale); 209 diffuseColor = mix( diffuseColor, diffuseColor1, alphaBlend.g ); 210 #ifdef DIFFUSEMAP_2 211 vec4 diffuseColor2 = texture2D(m_DiffuseMap_2, texCoord * m_DiffuseMap_2_scale); 212 diffuseColor = mix( diffuseColor, diffuseColor2, alphaBlend.b ); 213 #ifdef DIFFUSEMAP_3 214 vec4 diffuseColor3 = texture2D(m_DiffuseMap_3, texCoord * m_DiffuseMap_3_scale); 215 diffuseColor = mix( diffuseColor, diffuseColor3, alphaBlend.a ); 216 #ifdef ALPHAMAP_1 217 #ifdef DIFFUSEMAP_4 218 vec4 diffuseColor4 = texture2D(m_DiffuseMap_4, texCoord * m_DiffuseMap_4_scale); 219 diffuseColor = mix( diffuseColor, diffuseColor4, alphaBlend1.r ); 220 #ifdef DIFFUSEMAP_5 221 vec4 diffuseColor5 = texture2D(m_DiffuseMap_5, texCoord * m_DiffuseMap_5_scale); 222 diffuseColor = mix( diffuseColor, diffuseColor5, alphaBlend1.g ); 223 #ifdef DIFFUSEMAP_6 224 vec4 diffuseColor6 = texture2D(m_DiffuseMap_6, texCoord * m_DiffuseMap_6_scale); 225 diffuseColor = mix( diffuseColor, diffuseColor6, alphaBlend1.b ); 226 #ifdef DIFFUSEMAP_7 227 vec4 diffuseColor7 = texture2D(m_DiffuseMap_7, texCoord * m_DiffuseMap_7_scale); 228 diffuseColor = mix( diffuseColor, diffuseColor7, alphaBlend1.a ); 229 #ifdef ALPHAMAP_2 230 #ifdef DIFFUSEMAP_8 231 vec4 diffuseColor8 = texture2D(m_DiffuseMap_8, texCoord * m_DiffuseMap_8_scale); 232 diffuseColor = mix( diffuseColor, diffuseColor8, alphaBlend2.r ); 233 #ifdef DIFFUSEMAP_9 234 vec4 diffuseColor9 = texture2D(m_DiffuseMap_9, texCoord * m_DiffuseMap_9_scale); 235 diffuseColor = mix( diffuseColor, diffuseColor9, alphaBlend2.g ); 236 #ifdef DIFFUSEMAP_10 237 vec4 diffuseColor10 = texture2D(m_DiffuseMap_10, texCoord * m_DiffuseMap_10_scale); 238 diffuseColor = mix( diffuseColor, diffuseColor10, alphaBlend2.b ); 239 #ifdef DIFFUSEMAP_11 240 vec4 diffuseColor11 = texture2D(m_DiffuseMap_11, texCoord * m_DiffuseMap_11_scale); 241 diffuseColor = mix( diffuseColor, diffuseColor11, alphaBlend2.a ); 242 #endif 243 #endif 244 #endif 245 #endif 246 #endif 247 #endif 248 #endif 249 #endif 250 #endif 251 #endif 252 #endif 253 #endif 254 #endif 255 return diffuseColor; 256 } 257 258 vec3 calculateNormal(in vec2 texCoord) { 259 vec3 normal = vec3(0,0,1); 260 vec3 n = vec3(0,0,0); 261 262 vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); 263 264 #ifdef ALPHAMAP_1 265 vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); 266 #endif 267 #ifdef ALPHAMAP_2 268 vec4 alphaBlend2 = texture2D( m_AlphaMap_2, texCoord.xy ); 269 #endif 270 271 #ifdef NORMALMAP 272 n = texture2D(m_NormalMap, texCoord * m_DiffuseMap_0_scale).xyz; 273 normal += n * alphaBlend.r; 274 #endif 275 276 #ifdef NORMALMAP_1 277 n = texture2D(m_NormalMap_1, texCoord * m_DiffuseMap_1_scale).xyz; 278 normal += n * alphaBlend.g; 279 #endif 280 281 #ifdef NORMALMAP_2 282 n = texture2D(m_NormalMap_2, texCoord * m_DiffuseMap_2_scale).xyz; 283 normal += n * alphaBlend.b; 284 #endif 285 286 #ifdef NORMALMAP_3 287 n = texture2D(m_NormalMap_3, texCoord * m_DiffuseMap_3_scale).xyz; 288 normal += n * alphaBlend.a; 289 #endif 290 291 #ifdef ALPHAMAP_1 292 #ifdef NORMALMAP_4 293 n = texture2D(m_NormalMap_4, texCoord * m_DiffuseMap_4_scale).xyz; 294 normal += n * alphaBlend1.r; 295 #endif 296 297 #ifdef NORMALMAP_5 298 n = texture2D(m_NormalMap_5, texCoord * m_DiffuseMap_5_scale).xyz; 299 normal += n * alphaBlend1.g; 300 #endif 301 302 #ifdef NORMALMAP_6 303 n = texture2D(m_NormalMap_6, texCoord * m_DiffuseMap_6_scale).xyz; 304 normal += n * alphaBlend1.b; 305 #endif 306 307 #ifdef NORMALMAP_7 308 n = texture2D(m_NormalMap_7, texCoord * m_DiffuseMap_7_scale).xyz; 309 normal += n * alphaBlend1.a; 310 #endif 311 #endif 312 313 #ifdef ALPHAMAP_2 314 #ifdef NORMALMAP_8 315 n = texture2D(m_NormalMap_8, texCoord * m_DiffuseMap_8_scale).xyz; 316 normal += n * alphaBlend2.r; 317 #endif 318 319 #ifdef NORMALMAP_9 320 n = texture2D(m_NormalMap_9, texCoord * m_DiffuseMap_9_scale); 321 normal += n * alphaBlend2.g; 322 #endif 323 324 #ifdef NORMALMAP_10 325 n = texture2D(m_NormalMap_10, texCoord * m_DiffuseMap_10_scale); 326 normal += n * alphaBlend2.b; 327 #endif 328 329 #ifdef NORMALMAP_11 330 n = texture2D(m_NormalMap_11, texCoord * m_DiffuseMap_11_scale); 331 normal += n * alphaBlend2.a; 332 #endif 333 #endif 334 335 normal = (normal.xyz * vec3(2.0) - vec3(1.0)); 336 return normalize(normal); 337 } 338 339 #ifdef TRI_PLANAR_MAPPING 340 341 vec4 getTriPlanarBlend(in vec4 coords, in vec3 blending, in sampler2D map, in float scale) { 342 vec4 col1 = texture2D( map, coords.yz * scale); 343 vec4 col2 = texture2D( map, coords.xz * scale); 344 vec4 col3 = texture2D( map, coords.xy * scale); 345 // blend the results of the 3 planar projections. 346 vec4 tex = col1 * blending.x + col2 * blending.y + col3 * blending.z; 347 return tex; 348 } 349 350 vec4 calculateTriPlanarDiffuseBlend(in vec3 wNorm, in vec4 wVert, in vec2 texCoord) { 351 // tri-planar texture bending factor for this fragment's normal 352 vec3 blending = abs( wNorm ); 353 blending = (blending -0.2) * 0.7; 354 blending = normalize(max(blending, 0.00001)); // Force weights to sum to 1.0 (very important!) 355 float b = (blending.x + blending.y + blending.z); 356 blending /= vec3(b, b, b); 357 358 // texture coords 359 vec4 coords = wVert; 360 361 // blend the results of the 3 planar projections. 362 vec4 tex0 = getTriPlanarBlend(coords, blending, m_DiffuseMap, m_DiffuseMap_0_scale); 363 364 #ifdef DIFFUSEMAP_1 365 // blend the results of the 3 planar projections. 366 vec4 tex1 = getTriPlanarBlend(coords, blending, m_DiffuseMap_1, m_DiffuseMap_1_scale); 367 #endif 368 #ifdef DIFFUSEMAP_2 369 // blend the results of the 3 planar projections. 370 vec4 tex2 = getTriPlanarBlend(coords, blending, m_DiffuseMap_2, m_DiffuseMap_2_scale); 371 #endif 372 #ifdef DIFFUSEMAP_3 373 // blend the results of the 3 planar projections. 374 vec4 tex3 = getTriPlanarBlend(coords, blending, m_DiffuseMap_3, m_DiffuseMap_3_scale); 375 #endif 376 #ifdef DIFFUSEMAP_4 377 // blend the results of the 3 planar projections. 378 vec4 tex4 = getTriPlanarBlend(coords, blending, m_DiffuseMap_4, m_DiffuseMap_4_scale); 379 #endif 380 #ifdef DIFFUSEMAP_5 381 // blend the results of the 3 planar projections. 382 vec4 tex5 = getTriPlanarBlend(coords, blending, m_DiffuseMap_5, m_DiffuseMap_5_scale); 383 #endif 384 #ifdef DIFFUSEMAP_6 385 // blend the results of the 3 planar projections. 386 vec4 tex6 = getTriPlanarBlend(coords, blending, m_DiffuseMap_6, m_DiffuseMap_6_scale); 387 #endif 388 #ifdef DIFFUSEMAP_7 389 // blend the results of the 3 planar projections. 390 vec4 tex7 = getTriPlanarBlend(coords, blending, m_DiffuseMap_7, m_DiffuseMap_7_scale); 391 #endif 392 #ifdef DIFFUSEMAP_8 393 // blend the results of the 3 planar projections. 394 vec4 tex8 = getTriPlanarBlend(coords, blending, m_DiffuseMap_8, m_DiffuseMap_8_scale); 395 #endif 396 #ifdef DIFFUSEMAP_9 397 // blend the results of the 3 planar projections. 398 vec4 tex9 = getTriPlanarBlend(coords, blending, m_DiffuseMap_9, m_DiffuseMap_9_scale); 399 #endif 400 #ifdef DIFFUSEMAP_10 401 // blend the results of the 3 planar projections. 402 vec4 tex10 = getTriPlanarBlend(coords, blending, m_DiffuseMap_10, m_DiffuseMap_10_scale); 403 #endif 404 #ifdef DIFFUSEMAP_11 405 // blend the results of the 3 planar projections. 406 vec4 tex11 = getTriPlanarBlend(coords, blending, m_DiffuseMap_11, m_DiffuseMap_11_scale); 407 #endif 408 409 vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); 410 411 #ifdef ALPHAMAP_1 412 vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); 413 #endif 414 #ifdef ALPHAMAP_2 415 vec4 alphaBlend2 = texture2D( m_AlphaMap_2, texCoord.xy ); 416 #endif 417 418 vec4 diffuseColor = tex0 * alphaBlend.r; 419 #ifdef DIFFUSEMAP_1 420 diffuseColor = mix( diffuseColor, tex1, alphaBlend.g ); 421 #ifdef DIFFUSEMAP_2 422 diffuseColor = mix( diffuseColor, tex2, alphaBlend.b ); 423 #ifdef DIFFUSEMAP_3 424 diffuseColor = mix( diffuseColor, tex3, alphaBlend.a ); 425 #ifdef ALPHAMAP_1 426 #ifdef DIFFUSEMAP_4 427 diffuseColor = mix( diffuseColor, tex4, alphaBlend1.r ); 428 #ifdef DIFFUSEMAP_5 429 diffuseColor = mix( diffuseColor, tex5, alphaBlend1.g ); 430 #ifdef DIFFUSEMAP_6 431 diffuseColor = mix( diffuseColor, tex6, alphaBlend1.b ); 432 #ifdef DIFFUSEMAP_7 433 diffuseColor = mix( diffuseColor, tex7, alphaBlend1.a ); 434 #ifdef ALPHAMAP_2 435 #ifdef DIFFUSEMAP_8 436 diffuseColor = mix( diffuseColor, tex8, alphaBlend2.r ); 437 #ifdef DIFFUSEMAP_9 438 diffuseColor = mix( diffuseColor, tex9, alphaBlend2.g ); 439 #ifdef DIFFUSEMAP_10 440 diffuseColor = mix( diffuseColor, tex10, alphaBlend2.b ); 441 #ifdef DIFFUSEMAP_11 442 diffuseColor = mix( diffuseColor, tex11, alphaBlend2.a ); 443 #endif 444 #endif 445 #endif 446 #endif 447 #endif 448 #endif 449 #endif 450 #endif 451 #endif 452 #endif 453 #endif 454 #endif 455 #endif 456 457 return diffuseColor; 458 } 459 460 vec3 calculateNormalTriPlanar(in vec3 wNorm, in vec4 wVert,in vec2 texCoord) { 461 // tri-planar texture bending factor for this fragment's world-space normal 462 vec3 blending = abs( wNorm ); 463 blending = (blending -0.2) * 0.7; 464 blending = normalize(max(blending, 0.00001)); // Force weights to sum to 1.0 (very important!) 465 float b = (blending.x + blending.y + blending.z); 466 blending /= vec3(b, b, b); 467 468 // texture coords 469 vec4 coords = wVert; 470 vec4 alphaBlend = texture2D( m_AlphaMap, texCoord.xy ); 471 472 #ifdef ALPHAMAP_1 473 vec4 alphaBlend1 = texture2D( m_AlphaMap_1, texCoord.xy ); 474 #endif 475 #ifdef ALPHAMAP_2 476 vec4 alphaBlend2 = texture2D( m_AlphaMap_2, texCoord.xy ); 477 #endif 478 479 vec3 normal = vec3(0,0,1); 480 vec3 n = vec3(0,0,0); 481 482 #ifdef NORMALMAP 483 n = getTriPlanarBlend(coords, blending, m_NormalMap, m_DiffuseMap_0_scale).xyz; 484 normal += n * alphaBlend.r; 485 #endif 486 487 #ifdef NORMALMAP_1 488 n = getTriPlanarBlend(coords, blending, m_NormalMap_1, m_DiffuseMap_1_scale).xyz; 489 normal += n * alphaBlend.g; 490 #endif 491 492 #ifdef NORMALMAP_2 493 n = getTriPlanarBlend(coords, blending, m_NormalMap_2, m_DiffuseMap_2_scale).xyz; 494 normal += n * alphaBlend.b; 495 #endif 496 497 #ifdef NORMALMAP_3 498 n = getTriPlanarBlend(coords, blending, m_NormalMap_3, m_DiffuseMap_3_scale).xyz; 499 normal += n * alphaBlend.a; 500 #endif 501 502 #ifdef ALPHAMAP_1 503 #ifdef NORMALMAP_4 504 n = getTriPlanarBlend(coords, blending, m_NormalMap_4, m_DiffuseMap_4_scale).xyz; 505 normal += n * alphaBlend1.r; 506 #endif 507 508 #ifdef NORMALMAP_5 509 n = getTriPlanarBlend(coords, blending, m_NormalMap_5, m_DiffuseMap_5_scale).xyz; 510 normal += n * alphaBlend1.g; 511 #endif 512 513 #ifdef NORMALMAP_6 514 n = getTriPlanarBlend(coords, blending, m_NormalMap_6, m_DiffuseMap_6_scale).xyz; 515 normal += n * alphaBlend1.b; 516 #endif 517 518 #ifdef NORMALMAP_7 519 n = getTriPlanarBlend(coords, blending, m_NormalMap_7, m_DiffuseMap_7_scale).xyz; 520 normal += n * alphaBlend1.a; 521 #endif 522 #endif 523 524 #ifdef ALPHAMAP_2 525 #ifdef NORMALMAP_8 526 n = getTriPlanarBlend(coords, blending, m_NormalMap_8, m_DiffuseMap_8_scale).xyz; 527 normal += n * alphaBlend2.r; 528 #endif 529 530 #ifdef NORMALMAP_9 531 n = getTriPlanarBlend(coords, blending, m_NormalMap_9, m_DiffuseMap_9_scale).xyz; 532 normal += n * alphaBlend2.g; 533 #endif 534 535 #ifdef NORMALMAP_10 536 n = getTriPlanarBlend(coords, blending, m_NormalMap_10, m_DiffuseMap_10_scale).xyz; 537 normal += n * alphaBlend2.b; 538 #endif 539 540 #ifdef NORMALMAP_11 541 n = getTriPlanarBlend(coords, blending, m_NormalMap_11, m_DiffuseMap_11_scale).xyz; 542 normal += n * alphaBlend2.a; 543 #endif 544 #endif 545 546 normal = (normal.xyz * vec3(2.0) - vec3(1.0)); 547 return normalize(normal); 548 } 549 #endif 550 551#endif 552 553 554 555void main(){ 556 557 //---------------------- 558 // diffuse calculations 559 //---------------------- 560 #ifdef DIFFUSEMAP 561 #ifdef ALPHAMAP 562 #ifdef TRI_PLANAR_MAPPING 563 vec4 diffuseColor = calculateTriPlanarDiffuseBlend(wNormal, wVertex, texCoord); 564 #else 565 vec4 diffuseColor = calculateDiffuseBlend(texCoord); 566 #endif 567 #else 568 vec4 diffuseColor = texture2D(m_DiffuseMap, texCoord); 569 #endif 570 #else 571 vec4 diffuseColor = vec4(1.0); 572 #endif 573 574 float spotFallOff = 1.0; 575 if(g_LightDirection.w!=0.0){ 576 vec3 L=normalize(lightVec.xyz); 577 vec3 spotdir = normalize(g_LightDirection.xyz); 578 float curAngleCos = dot(-L, spotdir); 579 float innerAngleCos = floor(g_LightDirection.w) * 0.001; 580 float outerAngleCos = fract(g_LightDirection.w); 581 float innerMinusOuter = innerAngleCos - outerAngleCos; 582 583 spotFallOff = (curAngleCos - outerAngleCos) / innerMinusOuter; 584 585 if(spotFallOff <= 0.0){ 586 gl_FragColor = AmbientSum * diffuseColor; 587 return; 588 }else{ 589 spotFallOff = clamp(spotFallOff, 0.0, 1.0); 590 } 591 } 592 593 //--------------------- 594 // normal calculations 595 //--------------------- 596 #if defined(NORMALMAP) || defined(NORMALMAP_1) || defined(NORMALMAP_2) || defined(NORMALMAP_3) || defined(NORMALMAP_4) || defined(NORMALMAP_5) || defined(NORMALMAP_6) || defined(NORMALMAP_7) || defined(NORMALMAP_8) || defined(NORMALMAP_9) || defined(NORMALMAP_10) || defined(NORMALMAP_11) 597 #ifdef TRI_PLANAR_MAPPING 598 vec3 normal = calculateNormalTriPlanar(wNormal, wVertex, texCoord); 599 #else 600 vec3 normal = calculateNormal(texCoord); 601 #endif 602 #else 603 vec3 normal = vNormal; 604 #endif 605 606 607 //----------------------- 608 // lighting calculations 609 //----------------------- 610 vec4 lightDir = vLightDir; 611 lightDir.xyz = normalize(lightDir.xyz); 612 613 vec2 light = computeLighting(vPosition, normal, vViewDir.xyz, lightDir.xyz)*spotFallOff; 614 615 vec4 specularColor = vec4(1.0); 616 617 //-------------------------- 618 // final color calculations 619 //-------------------------- 620 gl_FragColor = AmbientSum * diffuseColor + 621 DiffuseSum * diffuseColor * light.x + 622 SpecularSum * specularColor * light.y; 623 624 //gl_FragColor.a = alpha; 625}