mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-13 06:21:29 -10:00
This is a fix for models with no spec map since the current default factor looks very odd for retail models.
59 lines
2.3 KiB
Plaintext
59 lines
2.3 KiB
Plaintext
|
|
const int LT_DIRECTIONAL = 0; // A light like a sun
|
|
const int LT_POINT = 1; // A point light, like an explosion
|
|
const int LT_TUBE = 2; // A tube light, like a fluorescent light
|
|
const int LT_CONE = 3; // A cone light, like a flood light
|
|
|
|
const float SPEC_INTENSITY_POINT = 5.3 ;// Point light
|
|
const float SPEC_INTENSITY_DIRECTIONAL = 3.0 ;// Directional light
|
|
const float SPECULAR_FACTOR = 1.75;
|
|
const float SPECULAR_ALPHA = 0.1;
|
|
const float SPEC_FACTOR_NO_SPEC_MAP = 0.1;
|
|
const float ENV_ALPHA_FACTOR = 0.3;
|
|
const float GLOW_MAP_INTENSITY = 1.5;
|
|
const float AMBIENT_LIGHT_BOOST = 1.0;
|
|
const float GLOW_MAP_SRGB_MULTIPLIER = 3.0;
|
|
|
|
vec3 FresnelSchlick(vec3 specColor, vec3 light, vec3 halfVec)
|
|
{
|
|
return specColor + (vec3(1.0) - specColor) * pow(1.0 - clamp(dot(light, halfVec), 0.0, 1.0), 5.0);
|
|
}
|
|
|
|
vec3 SpecularBlinnPhong(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, float specPower, float fresnel, float dotNL)
|
|
{
|
|
return mix(specColor, FresnelSchlick(specColor, light, halfVec), fresnel) * ((specPower + 2.0) / 8.0 ) * pow(clamp(dot(normal, halfVec), 0.0, 1.0), specPower) * dotNL;
|
|
}
|
|
|
|
vec3 SpecularGGX(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, vec3 view, float gloss, float fresnelFactor, float dotNL)
|
|
{
|
|
float roughness = clamp(1.0f - gloss, 0.0f, 1.0f);
|
|
float alpha = roughness * roughness;
|
|
|
|
float dotNH = clamp(dot(normal, halfVec), 0.0f, 1.0f);
|
|
float dotNV = clamp(dot(normal, view), 0.0f, 1.0f);
|
|
|
|
float alphaSqr = alpha * alpha;
|
|
float pi = 3.14159f;
|
|
float denom = dotNH * dotNH * (alphaSqr - 1.0f) + 1.0f;
|
|
float distribution = alphaSqr / (pi * denom * denom);
|
|
|
|
vec3 fresnel = mix(specColor, FresnelSchlick(specColor, light, halfVec), fresnelFactor);
|
|
|
|
float alphaPrime = roughness + 1.0f;
|
|
float k = alphaPrime * alphaPrime / 8.0f;
|
|
float g1vNL = 1.0f / (dotNL * (1.0f - k) + k);
|
|
float g1vNV = 1.0f / (dotNV * (1.0f - k) + k);
|
|
float visibility = g1vNL * g1vNV;
|
|
|
|
return distribution * fresnel * visibility * dotNL;
|
|
}
|
|
|
|
vec3 computeLighting(vec3 specColor, vec3 light, vec3 normal, vec3 halfVec, vec3 view, float gloss, float fresnelFactor, float dotNL)
|
|
{
|
|
#ifdef FLAG_LIGHT_MODEL_BLINN_PHONG
|
|
return SpecularBlinnPhong(specColor, light, normal, halfVec, 32, fresnelFactor, dotNL);
|
|
#else
|
|
return SpecularGGX(specColor, light, normal, halfVec, view, gloss, fresnelFactor, dotNL);
|
|
#endif
|
|
}
|