171 lines
3.8 KiB
Plaintext
171 lines
3.8 KiB
Plaintext
|
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
|