maps_lights_pars.glsl 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #if defined( USE_ENVMAP ) && defined( PHYSICAL )
  2. vec3 getLightProbeIndirectIrradiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in int maxMIPLevel ) {
  3. vec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );
  4. #ifdef ENVMAP_TYPE_CUBE
  5. vec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );
  6. // TODO: replace with properly filtered cubemaps and access the irradiance LOD level, be it the last LOD level
  7. // of a specular cubemap, or just the default level of a specially created irradiance cubemap.
  8. #ifdef TEXTURE_LOD_EXT
  9. vec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );
  10. #else
  11. // force the bias high to get the last LOD level as it is the most blurred.
  12. vec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );
  13. #endif
  14. envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;
  15. #elif defined( ENVMAP_TYPE_CUBE_UV )
  16. vec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );
  17. vec4 envMapColor = textureCubeUV( queryVec, 1.0 );
  18. #else
  19. vec4 envMapColor = vec4( 0.0 );
  20. #endif
  21. return PI * envMapColor.rgb * envMapIntensity;
  22. }
  23. // taken from here: http://casual-effects.blogspot.ca/2011/08/plausible-environment-lighting-in-two.html
  24. float getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {
  25. //float envMapWidth = pow( 2.0, maxMIPLevelScalar );
  26. //float desiredMIPLevel = log2( envMapWidth * sqrt( 3.0 ) ) - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );
  27. float maxMIPLevelScalar = float( maxMIPLevel );
  28. float desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );
  29. // clamp to allowable LOD ranges.
  30. return clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );
  31. }
  32. vec3 getLightProbeIndirectRadiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {
  33. #ifdef ENVMAP_MODE_REFLECTION
  34. vec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );
  35. #else
  36. vec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );
  37. #endif
  38. reflectVec = inverseTransformDirection( reflectVec, viewMatrix );
  39. float specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );
  40. #ifdef ENVMAP_TYPE_CUBE
  41. vec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );
  42. #ifdef TEXTURE_LOD_EXT
  43. vec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );
  44. #else
  45. vec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );
  46. #endif
  47. envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;
  48. #elif defined( ENVMAP_TYPE_CUBE_UV )
  49. vec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );
  50. vec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));
  51. #elif defined( ENVMAP_TYPE_EQUIREC )
  52. vec2 sampleUV;
  53. sampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;
  54. sampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;
  55. #ifdef TEXTURE_LOD_EXT
  56. vec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );
  57. #else
  58. vec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );
  59. #endif
  60. envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;
  61. #elif defined( ENVMAP_TYPE_SPHERE )
  62. vec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );
  63. #ifdef TEXTURE_LOD_EXT
  64. vec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );
  65. #else
  66. vec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );
  67. #endif
  68. envMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;
  69. #endif
  70. return envMapColor.rgb * envMapIntensity;
  71. }
  72. #endif