提交 d8552f34 编写于 作者: B Ben Houston

introduce IncidentLight struct

上级 56b64721
...@@ -82,9 +82,15 @@ vec3 linearToOutput( in vec3 a ) { ...@@ -82,9 +82,15 @@ vec3 linearToOutput( in vec3 a ) {
} }
vec3 BRDF_Lambert( const in vec3 lightColor, const in vec3 lightDir, const in vec3 normal, const in vec3 diffuseColor ) { struct IncidentLight {
vec3 color;
vec3 direction;
};
return lightColor * diffuseColor * ( saturate( dot( normal, lightDir ) ) );
vec3 BRDF_Lambert( const in IncidentLight incidentLight, const in vec3 normal, const in vec3 diffuseColor ) {
return incidentLight.color * diffuseColor * ( saturate( dot( normal, incidentLight.direction ) ) );
// the above should be scaled by '' * RECIPROCAL_PI' // the above should be scaled by '' * RECIPROCAL_PI'
} }
...@@ -117,17 +123,17 @@ float D_BlinnPhong( const in float shininess, const in float dotNH ) { ...@@ -117,17 +123,17 @@ float D_BlinnPhong( const in float shininess, const in float dotNH ) {
} }
vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float shininess ) { vec3 BRDF_BlinnPhong( const in IncidentLight incidentLight, const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float shininess ) {
vec3 halfDir = normalize( lightDir + viewDir ); vec3 halfDir = normalize( incidentLight.direction + viewDir );
float dotNH = saturate( dot( normal, halfDir ) ); float dotNH = saturate( dot( normal, halfDir ) );
float dotLH = saturate( dot( lightDir, halfDir ) ); float dotLH = saturate( dot( incidentLight.direction, halfDir ) );
vec3 F = F_Schlick( specularColor, dotLH ); vec3 F = F_Schlick( specularColor, dotLH );
float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ ); float G = G_BlinnPhong_Implicit( /* dotNL, dotNV */ );
float D = D_BlinnPhong( shininess, dotNH ); float D = D_BlinnPhong( shininess, dotNH );
return lightColor * F * ( G * D ); return incidentLight.color * F * ( G * D );
} }
...@@ -142,10 +148,10 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in ...@@ -142,10 +148,10 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in
uniform DirectionalLight directionalLights[ MAX_DIR_LIGHTS ]; uniform DirectionalLight directionalLights[ MAX_DIR_LIGHTS ];
void getDirLightDirect( const in DirectionalLight directionalLight, out vec3 lightColor, out vec3 lightDir ) { void getDirLightDirect( const in DirectionalLight directionalLight, out IncidentLight incidentLight ) {
lightDir = directionalLight.direction; incidentLight.color = directionalLight.color;
lightColor = directionalLight.color; incidentLight.direction = directionalLight.direction;
} }
...@@ -162,15 +168,15 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in ...@@ -162,15 +168,15 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in
uniform PointLight pointLights[ MAX_POINT_LIGHTS ]; uniform PointLight pointLights[ MAX_POINT_LIGHTS ];
void getPointLightDirect( const in PointLight pointLight, const in vec3 position, out vec3 lightColor, out vec3 lightDir ) { void getPointLightDirect( const in PointLight pointLight, const in vec3 position, out IncidentLight incidentLight ) {
vec3 lightPosition = pointLight.position; vec3 lightPosition = pointLight.position;
vec3 lVector = lightPosition - position; vec3 lVector = lightPosition - position;
lightDir = normalize( lVector ); incidentLight.direction = normalize( lVector );
lightColor = pointLight.color; incidentLight.color = pointLight.color;
lightColor *= calcLightAttenuation( length( lVector ), pointLight.distance, pointLight.decay ); incidentLight.color *= calcLightAttenuation( length( lVector ), pointLight.distance, pointLight.decay );
} }
...@@ -190,18 +196,18 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in ...@@ -190,18 +196,18 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in
uniform SpotLight spotLights[ MAX_SPOT_LIGHTS ]; uniform SpotLight spotLights[ MAX_SPOT_LIGHTS ];
void getSpotLightDirect( const in SpotLight spotLight, const in vec3 position, out vec3 lightColor, out vec3 lightDir ) { void getSpotLightDirect( const in SpotLight spotLight, const in vec3 position, out IncidentLight incidentLight ) {
vec3 lightPosition = spotLight.position; vec3 lightPosition = spotLight.position;
vec3 lVector = lightPosition - position; vec3 lVector = lightPosition - position;
lightDir = normalize( lVector ); incidentLight.direction = normalize( lVector );
float spotEffect = dot( spotLight.direction, lightDir ); float spotEffect = dot( spotLight.direction, incidentLight.direction );
spotEffect = saturate( pow( saturate( spotEffect ), spotLight.exponent ) ); spotEffect = saturate( pow( saturate( spotEffect ), spotLight.exponent ) );
lightColor = spotLight.color; incidentLight.color = spotLight.color;
lightColor *= ( spotEffect * calcLightAttenuation( length( lVector ), spotLight.distance, spotLight.decay ) ); incidentLight.color *= ( spotEffect * calcLightAttenuation( length( lVector ), spotLight.distance, spotLight.decay ) );
} }
...@@ -218,15 +224,15 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in ...@@ -218,15 +224,15 @@ vec3 BRDF_BlinnPhong( const in vec3 lightColor, const in vec3 lightDir, const in
uniform HemisphereLight hemisphereLights[ MAX_HEMI_LIGHTS ]; uniform HemisphereLight hemisphereLights[ MAX_HEMI_LIGHTS ];
void getHemisphereLightIndirect( const in HemisphereLight hemiLight, const in vec3 normal, out vec3 lightColor, out vec3 lightDir ) { void getHemisphereLightIndirect( const in HemisphereLight hemiLight, const in vec3 normal, out IncidentLight incidentLight ) {
float dotNL = dot( normal, hemiLight.direction ); float dotNL = dot( normal, hemiLight.direction );
float hemiDiffuseWeight = 0.5 * dotNL + 0.5; float hemiDiffuseWeight = 0.5 * dotNL + 0.5;
lightColor = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); incidentLight.color = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );
lightDir = normal; incidentLight.direction = normal;
} }
......
...@@ -13,14 +13,14 @@ vec3 diffuse = vec3( 1.0 ); ...@@ -13,14 +13,14 @@ vec3 diffuse = vec3( 1.0 );
for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) { for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getPointLightDirect( pointLights[i], mvPosition.xyz, lightColor, lightDir ); getPointLightDirect( pointLights[ i ], mvPosition.xyz, incidentLight );
vLightFront += BRDF_Lambert( lightColor, lightDir, normal, diffuse ); vLightFront += BRDF_Lambert( incidentLight, normal, diffuse );
#ifdef DOUBLE_SIDED #ifdef DOUBLE_SIDED
vLightBack += BRDF_Lambert( lightColor, lightDir, -normal, diffuse ); vLightBack += BRDF_Lambert( incidentLight, -normal, diffuse );
#endif #endif
...@@ -32,14 +32,14 @@ vec3 diffuse = vec3( 1.0 ); ...@@ -32,14 +32,14 @@ vec3 diffuse = vec3( 1.0 );
for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) { for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getSpotLightDirect( spotLights[i], mvPosition.xyz, lightColor, lightDir ); getSpotLightDirect( spotLights[ i ], mvPosition.xyz, incidentLight );
vLightFront += BRDF_Lambert( lightColor, lightDir, normal, diffuse ); vLightFront += BRDF_Lambert( incidentLight, normal, diffuse );
#ifdef DOUBLE_SIDED #ifdef DOUBLE_SIDED
vLightBack += BRDF_Lambert( lightColor, lightDir, -normal, diffuse ); vLightBack += BRDF_Lambert( incidentLight, -normal, diffuse );
#endif #endif
...@@ -51,14 +51,14 @@ vec3 diffuse = vec3( 1.0 ); ...@@ -51,14 +51,14 @@ vec3 diffuse = vec3( 1.0 );
for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) { for ( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getDirLightDirect( directionalLights[i], lightColor, lightDir ); getDirLightDirect( directionalLights[ i ], incidentLight );
vLightFront += BRDF_Lambert( lightColor, lightDir, normal, diffuse ); vLightFront += BRDF_Lambert( incidentLight, normal, diffuse );
#ifdef DOUBLE_SIDED #ifdef DOUBLE_SIDED
vLightBack += BRDF_Lambert( lightColor, lightDir, -normal, diffuse ); vLightBack += BRDF_Lambert( incidentLight, -normal, diffuse );
#endif #endif
...@@ -70,16 +70,16 @@ vec3 diffuse = vec3( 1.0 ); ...@@ -70,16 +70,16 @@ vec3 diffuse = vec3( 1.0 );
for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) { for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getHemisphereLightIndirect( hemisphereLights[ i ], normal, lightColor, lightDir ); getHemisphereLightIndirect( hemisphereLights[ i ], normal, incidentLight );
vLightFront += BRDF_Lambert( lightColor, lightDir, normal, diffuse ); vLightFront += BRDF_Lambert( incidentLight, normal, diffuse );
#ifdef DOUBLE_SIDED #ifdef DOUBLE_SIDED
getHemisphereLightIndirect( hemisphereLights[ i ], -normal, lightColor, lightDir ); incidentLight = getHemisphereLightIndirect( hemisphereLights[ i ], -normal );
vLightBack += BRDF_Lambert( lightColor, lightDir, -normal, diffuse ); vLightBack += BRDF_Lambert( incidentLight, -normal, diffuse );
#endif #endif
......
...@@ -17,14 +17,14 @@ vec3 diffuse = diffuseColor.rgb; ...@@ -17,14 +17,14 @@ vec3 diffuse = diffuseColor.rgb;
for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) { for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getPointLightDirect( pointLights[i], -vViewPosition, lightColor, lightDir ); getPointLightDirect( pointLights[ i ], -vViewPosition, incidentLight );
totalDirectReflectedDiffuse += totalDirectReflectedDiffuse +=
BRDF_Lambert( lightColor, lightDir, normal, diffuse ); BRDF_Lambert( incidentLight, normal, diffuse );
totalDirectReflectedSpecular += totalDirectReflectedSpecular +=
BRDF_BlinnPhong( lightColor, lightDir, normal, viewDir, specular, shininess ); BRDF_BlinnPhong( incidentLight, normal, viewDir, specular, shininess );
} }
...@@ -34,14 +34,14 @@ vec3 diffuse = diffuseColor.rgb; ...@@ -34,14 +34,14 @@ vec3 diffuse = diffuseColor.rgb;
for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) { for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getSpotLightDirect( spotLights[i], -vViewPosition, lightColor, lightDir ); getSpotLightDirect( spotLights[ i ], -vViewPosition, incidentLight );
totalDirectReflectedDiffuse += totalDirectReflectedDiffuse +=
BRDF_Lambert( lightColor, lightDir, normal, diffuse ); BRDF_Lambert( incidentLight, normal, diffuse );
totalDirectReflectedSpecular += totalDirectReflectedSpecular +=
BRDF_BlinnPhong( lightColor, lightDir, normal, viewDir, specular, shininess ); BRDF_BlinnPhong( incidentLight, normal, viewDir, specular, shininess );
} }
...@@ -51,14 +51,14 @@ vec3 diffuse = diffuseColor.rgb; ...@@ -51,14 +51,14 @@ vec3 diffuse = diffuseColor.rgb;
for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) { for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getDirLightDirect( directionalLights[i], lightColor, lightDir ); getDirLightDirect( directionalLights[ i ], incidentLight );
totalDirectReflectedDiffuse += totalDirectReflectedDiffuse +=
BRDF_Lambert( lightColor, lightDir, normal, diffuse ); BRDF_Lambert( incidentLight, normal, diffuse );
totalDirectReflectedSpecular += totalDirectReflectedSpecular +=
BRDF_BlinnPhong( lightColor, lightDir, normal, viewDir, specular, shininess ); BRDF_BlinnPhong( incidentLight, normal, viewDir, specular, shininess );
} }
...@@ -68,11 +68,11 @@ vec3 diffuse = diffuseColor.rgb; ...@@ -68,11 +68,11 @@ vec3 diffuse = diffuseColor.rgb;
for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) { for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
vec3 lightColor, lightDir; IncidentLight incidentLight;
getHemisphereLightIndirect( hemisphereLights[ i ], normal, lightColor, lightDir ); getHemisphereLightIndirect( hemisphereLights[ i ], normal, incidentLight );
totalIndirectReflectedDiffuse += totalIndirectReflectedDiffuse +=
BRDF_Lambert( lightColor, lightDir, normal, diffuse ); BRDF_Lambert( incidentLight, normal, diffuse );
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册