shadowfloorfrag.glsl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. precision mediump float;
  2. varying highp vec3 dv;
  3. varying mediump vec2 jv;
  4. varying mediump vec3 dC;
  5. uniform vec3 uShadowCatcherParams;
  6. #ifdef LIGHT_COUNT
  7. uniform vec4 uLightPositions[LIGHT_COUNT];
  8. uniform vec3 uLightDirections[LIGHT_COUNT];
  9. uniform vec3 uLightColors[LIGHT_COUNT];
  10. uniform vec3 uLightParams[LIGHT_COUNT];
  11. uniform vec3 uLightSpot[LIGHT_COUNT];
  12. #endif
  13. #define saturate(x) clamp( x, 0.0, 1.0 )
  14. #define SHADOW_COMPARE(a,b) ((a) < (b) || (b) >= 1.0 ? 1.0 : 0.0)
  15. #define SHADOW_CLIP(c,v) ((c.x<0.0 || c.x>1.0 || c.y<0.0 || c.y>1.0) ? 1.0 : v)
  16. #include <matshadows.glsl>
  17. void main(void){
  18. ev eA;eB(eA,SHADOW_KERNEL);
  19. vec3 jA=vec3(0.0,0.0,0.0);
  20. vec3 jB=vec3(0.0,0.0,0.0);
  21. for(int k=0;k<SHADOW_COUNT;++k){
  22. vec3 eH=uLightPositions[k].xyz-dv*uLightPositions[k].w;
  23. float eI=inversesqrt(dot(eH,eH));
  24. eH*=eI;
  25. float a=saturate(uLightParams[k].z/eI);
  26. a=1.0+a*(uLightParams[k].x+uLightParams[k].y*a);
  27. float s=saturate(dot(eH,uLightDirections[k]));
  28. s=saturate(uLightSpot[k].y-uLightSpot[k].z*(1.0-s*s));
  29. vec3 jC=mix(uLightColors[k].xyz,vec3(1.0,1.0,1.0),uShadowCatcherParams.x);
  30. vec3 jD=(a*s)*jC;jD*=saturate(dot(eH,dC));
  31. jB+=jD;jA+=jD*eA.eL[k];
  32. }
  33. float jE=1.0e-4;vec3 r=(jA+jE)/(jB+jE);
  34. float jF=saturate(dot(jv,jv))*uShadowCatcherParams.z;
  35. r=mix(r,vec3(1.0,1.0,1.0),jF);
  36. r=mix(vec3(1.0,1.0,1.0),r,uShadowCatcherParams.y);
  37. gl_FragColor.xyz=r;
  38. gl_FragColor.w=1.0;
  39. }