|
@@ -1,175 +1,3 @@
|
|
|
-uniform vec3 ambientLightColor;
|
|
|
-
|
|
|
-vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {
|
|
|
-
|
|
|
- vec3 irradiance = ambientLightColor;
|
|
|
-
|
|
|
- #ifndef PHYSICALLY_CORRECT_LIGHTS
|
|
|
-
|
|
|
- irradiance *= PI;
|
|
|
-
|
|
|
- #endif
|
|
|
-
|
|
|
- return irradiance;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-#if NUM_DIR_LIGHTS > 0
|
|
|
-
|
|
|
- struct DirectionalLight {
|
|
|
- vec3 direction;
|
|
|
- vec3 color;
|
|
|
-
|
|
|
- int shadow;
|
|
|
- float shadowBias;
|
|
|
- float shadowRadius;
|
|
|
- vec2 shadowMapSize;
|
|
|
- };
|
|
|
-
|
|
|
- uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];
|
|
|
-
|
|
|
- void getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {
|
|
|
-
|
|
|
- directLight.color = directionalLight.color;
|
|
|
- directLight.direction = directionalLight.direction;
|
|
|
- directLight.visible = true;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-#if NUM_POINT_LIGHTS > 0
|
|
|
-
|
|
|
- struct PointLight {
|
|
|
- vec3 position;
|
|
|
- vec3 color;
|
|
|
- float distance;
|
|
|
- float decay;
|
|
|
-
|
|
|
- int shadow;
|
|
|
- float shadowBias;
|
|
|
- float shadowRadius;
|
|
|
- vec2 shadowMapSize;
|
|
|
- float shadowCameraNear;
|
|
|
- float shadowCameraFar;
|
|
|
- };
|
|
|
-
|
|
|
- uniform PointLight pointLights[ NUM_POINT_LIGHTS ];
|
|
|
-
|
|
|
- // directLight is an out parameter as having it as a return value caused compiler errors on some devices
|
|
|
- void getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {
|
|
|
-
|
|
|
- vec3 lVector = pointLight.position - geometry.position;
|
|
|
- directLight.direction = normalize( lVector );
|
|
|
-
|
|
|
- float lightDistance = length( lVector );
|
|
|
-
|
|
|
- directLight.color = pointLight.color;
|
|
|
- directLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );
|
|
|
- directLight.visible = ( directLight.color != vec3( 0.0 ) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-#if NUM_SPOT_LIGHTS > 0
|
|
|
-
|
|
|
- struct SpotLight {
|
|
|
- vec3 position;
|
|
|
- vec3 direction;
|
|
|
- vec3 color;
|
|
|
- float distance;
|
|
|
- float decay;
|
|
|
- float coneCos;
|
|
|
- float penumbraCos;
|
|
|
-
|
|
|
- int shadow;
|
|
|
- float shadowBias;
|
|
|
- float shadowRadius;
|
|
|
- vec2 shadowMapSize;
|
|
|
- };
|
|
|
-
|
|
|
- uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];
|
|
|
-
|
|
|
- // directLight is an out parameter as having it as a return value caused compiler errors on some devices
|
|
|
- void getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {
|
|
|
-
|
|
|
- vec3 lVector = spotLight.position - geometry.position;
|
|
|
- directLight.direction = normalize( lVector );
|
|
|
-
|
|
|
- float lightDistance = length( lVector );
|
|
|
- float angleCos = dot( directLight.direction, spotLight.direction );
|
|
|
-
|
|
|
- if ( angleCos > spotLight.coneCos ) {
|
|
|
-
|
|
|
- float spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );
|
|
|
-
|
|
|
- directLight.color = spotLight.color;
|
|
|
- directLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );
|
|
|
- directLight.visible = true;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- directLight.color = vec3( 0.0 );
|
|
|
- directLight.visible = false;
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-#if NUM_RECT_AREA_LIGHTS > 0
|
|
|
-
|
|
|
- struct RectAreaLight {
|
|
|
- vec3 color;
|
|
|
- vec3 position;
|
|
|
- vec3 halfWidth;
|
|
|
- vec3 halfHeight;
|
|
|
- };
|
|
|
-
|
|
|
- // Pre-computed values of LinearTransformedCosine approximation of BRDF
|
|
|
- // BRDF approximation Texture is 64x64
|
|
|
- uniform sampler2D ltc_1; // RGBA Float
|
|
|
- uniform sampler2D ltc_2; // RGBA Float
|
|
|
-
|
|
|
- uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-#if NUM_HEMI_LIGHTS > 0
|
|
|
-
|
|
|
- struct HemisphereLight {
|
|
|
- vec3 direction;
|
|
|
- vec3 skyColor;
|
|
|
- vec3 groundColor;
|
|
|
- };
|
|
|
-
|
|
|
- uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];
|
|
|
-
|
|
|
- vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {
|
|
|
-
|
|
|
- float dotNL = dot( geometry.normal, hemiLight.direction );
|
|
|
- float hemiDiffuseWeight = 0.5 * dotNL + 0.5;
|
|
|
-
|
|
|
- vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );
|
|
|
-
|
|
|
- #ifndef PHYSICALLY_CORRECT_LIGHTS
|
|
|
-
|
|
|
- irradiance *= PI;
|
|
|
-
|
|
|
- #endif
|
|
|
-
|
|
|
- return irradiance;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
#if defined( USE_ENVMAP ) && defined( PHYSICAL )
|
|
|
|
|
|
vec3 getLightProbeIndirectIrradiance( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in int maxMIPLevel ) {
|