summaryrefslogtreecommitdiff
path: root/src/renderergl2/glsl/lightall_fp.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderergl2/glsl/lightall_fp.glsl')
-rw-r--r--src/renderergl2/glsl/lightall_fp.glsl113
1 files changed, 71 insertions, 42 deletions
diff --git a/src/renderergl2/glsl/lightall_fp.glsl b/src/renderergl2/glsl/lightall_fp.glsl
index 0f50a038..7c62d664 100644
--- a/src/renderergl2/glsl/lightall_fp.glsl
+++ b/src/renderergl2/glsl/lightall_fp.glsl
@@ -65,10 +65,6 @@ varying vec3 var_ViewDir;
#endif
#endif
-#if defined(USE_LIGHT_VERTEX) && !defined(USE_FAST_LIGHT)
-varying vec3 var_LightColor;
-#endif
-
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
varying vec4 var_LightDir;
#endif
@@ -329,9 +325,9 @@ mat3 cotangent_frame( vec3 N, vec3 p, vec2 uv )
void main()
{
- vec3 viewDir;
+ vec3 viewDir, lightColor, ambientColor;
vec3 L, N, E, H;
- float NL, NH, NE, EH;
+ float NL, NH, NE, EH, attenuation;
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
#if defined(USE_VERT_TANGENT_SPACE)
@@ -352,16 +348,10 @@ void main()
#endif
#if defined(USE_LIGHTMAP)
- vec4 lightSample = texture2D(u_LightMap, var_TexCoords.zw);
- vec3 lightColor = lightSample.rgb;
+ vec4 lightmapColor = texture2D(u_LightMap, var_TexCoords.zw);
#if defined(RGBM_LIGHTMAP)
- lightColor *= lightSample.a;
+ lightmapColor.rgb *= lightmapColor.a;
#endif
-#elif defined(USE_LIGHT_VECTOR) && !defined(USE_FAST_LIGHT)
- vec3 lightColor = u_DirectedLight * CalcLightAttenuation(float(var_LightDir.w > 0.0), var_LightDir.w / sqrLightDist);
- vec3 ambientColor = u_AmbientLight;
-#elif defined(USE_LIGHT_VERTEX) && !defined(USE_FAST_LIGHT)
- vec3 lightColor = var_LightColor;
#endif
vec2 texCoords = var_TexCoords.xy;
@@ -375,12 +365,22 @@ void main()
#endif
vec4 diffuse = texture2D(u_DiffuseMap, texCoords);
-#if defined(USE_GAMMA2_TEXTURES)
- diffuse.rgb *= diffuse.rgb;
-#endif
-
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
+ #if defined(USE_LIGHTMAP)
+ lightColor = lightmapColor.rgb * var_Color.rgb;
+ ambientColor = vec3(0.0);
+ attenuation = 1.0;
+ #elif defined(USE_LIGHT_VECTOR)
+ lightColor = u_DirectedLight * var_Color.rgb;
+ ambientColor = u_AmbientLight * var_Color.rgb;
+ attenuation = CalcLightAttenuation(float(var_LightDir.w > 0.0), var_LightDir.w / sqrLightDist);
+ #elif defined(USE_LIGHT_VERTEX)
+ lightColor = var_Color.rgb;
+ ambientColor = vec3(0.0);
+ attenuation = 1.0;
+ #endif
+
#if defined(USE_NORMALMAP)
#if defined(SWIZZLE_NORMALMAP)
N.xy = texture2D(u_NormalMap, texCoords).ag - vec2(0.5);
@@ -416,8 +416,13 @@ void main()
#endif
#endif
+ #if defined(r_lightGamma)
+ lightColor = pow(lightColor, vec3(r_lightGamma));
+ ambientColor = pow(ambientColor, vec3(r_lightGamma));
+ #endif
+
#if defined(USE_LIGHTMAP) || defined(USE_LIGHT_VERTEX)
- vec3 ambientColor = lightColor;
+ ambientColor = lightColor;
float surfNL = clamp(dot(var_Normal.xyz, L), 0.0, 1.0);
// Scale the incoming light to compensate for the baked-in light angle
@@ -426,7 +431,7 @@ void main()
// Recover any unused light as ambient, in case attenuation is over 4x or
// light is below the surface
- ambientColor -= lightColor * surfNL;
+ ambientColor = clamp(ambientColor - lightColor * surfNL, 0.0, 1.0);
#endif
vec3 reflectance;
@@ -436,15 +441,17 @@ void main()
#if defined(USE_SPECULARMAP)
vec4 specular = texture2D(u_SpecularMap, texCoords);
- #if defined(USE_GAMMA2_TEXTURES)
- specular.rgb *= specular.rgb;
- #endif
#else
vec4 specular = vec4(1.0);
#endif
specular *= u_SpecularScale;
+ #if defined(r_materialGamma)
+ diffuse.rgb = pow(diffuse.rgb, vec3(r_materialGamma));
+ specular.rgb = pow(specular.rgb, vec3(r_materialGamma));
+ #endif
+
float gloss = specular.a;
float shininess = exp2(gloss * 13.0);
@@ -482,7 +489,7 @@ void main()
#endif
#endif
- gl_FragColor.rgb = lightColor * reflectance * NL;
+ gl_FragColor.rgb = lightColor * reflectance * (attenuation * NL);
#if 0
vec3 aSpecular = EnvironmentBRDF(gloss, NE, specular.rgb);
@@ -506,19 +513,23 @@ void main()
// parallax corrected cubemap (cheaper trick)
// from http://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
- R += u_CubeMapInfo.xyz + u_CubeMapInfo.w * viewDir;
+ vec3 parallax = u_CubeMapInfo.xyz + u_CubeMapInfo.w * viewDir;
- vec3 cubeLightColor = textureCubeLod(u_CubeMap, R, 7.0 - gloss * 7.0).rgb * u_EnableTextures.w;
+ vec3 cubeLightColor = textureCubeLod(u_CubeMap, R + parallax, 7.0 - gloss * 7.0).rgb * u_EnableTextures.w;
- #if defined(USE_LIGHTMAP)
- cubeLightColor *= lightSample.rgb;
- #elif defined (USE_LIGHT_VERTEX)
- cubeLightColor *= var_LightColor;
- #else
- cubeLightColor *= lightColor * NL + ambientColor;
- #endif
+ // normalize cubemap based on lowest mip (~diffuse)
+ // multiplying cubemap values by lighting below depends on either this or the cubemap being normalized at generation
+ //vec3 cubeLightDiffuse = max(textureCubeLod(u_CubeMap, N, 6.0).rgb, 0.5 / 255.0);
+ //cubeLightColor /= dot(cubeLightDiffuse, vec3(0.2125, 0.7154, 0.0721));
+
+ #if defined(r_framebufferGamma)
+ cubeLightColor = pow(cubeLightColor, vec3(r_framebufferGamma));
+ #endif
+
+ // multiply cubemap values by lighting
+ // not technically correct, but helps make reflections look less unnatural
+ //cubeLightColor *= lightColor * (attenuation * NL) + ambientColor;
- //gl_FragColor.rgb += diffuse.rgb * textureCubeLod(u_CubeMap, N, 7.0).rgb * u_EnableTextures.w;
gl_FragColor.rgb += cubeLightColor * reflectance;
#endif
@@ -541,25 +552,43 @@ void main()
reflectance = CalcDiffuse(diffuse.rgb, N, L2, E, NE, NL2, shininess);
reflectance += CalcSpecular(specular.rgb, NH2, NL2, NE, EH2, gloss, shininess);
- lightColor = u_PrimaryLightColor;
+ lightColor = u_PrimaryLightColor * var_Color.rgb;
- // enable when point lights are supported as primary lights
- //lightColor *= CalcLightAttenuation(float(u_PrimaryLightDir.w > 0.0), u_PrimaryLightDir.w / sqrLightDist);
+ #if defined(r_lightGamma)
+ lightColor = pow(lightColor, vec3(r_lightGamma));
+ #endif
#if defined(USE_SHADOWMAP)
lightColor *= shadowValue;
#endif
+ // enable when point lights are supported as primary lights
+ //lightColor *= CalcLightAttenuation(float(u_PrimaryLightDir.w > 0.0), u_PrimaryLightDir.w / sqrLightDist);
+
gl_FragColor.rgb += lightColor * reflectance * NL2;
#endif
-
- gl_FragColor.a = diffuse.a;
#else
- gl_FragColor = diffuse;
+ lightColor = var_Color.rgb;
+
#if defined(USE_LIGHTMAP)
- gl_FragColor.rgb *= lightColor;
+ lightColor *= lightmapColor.rgb;
#endif
+
+ #if defined(r_lightGamma)
+ lightColor = pow(lightColor, vec3(r_lightGamma));
+ #endif
+
+ #if defined(r_materialGamma)
+ diffuse.rgb = pow(diffuse.rgb, vec3(r_materialGamma));
+ #endif
+
+ gl_FragColor.rgb = diffuse.rgb * lightColor;
+
+#endif
+
+#if defined(r_framebufferGamma)
+ gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1.0 / r_framebufferGamma));
#endif
- gl_FragColor *= var_Color;
+ gl_FragColor.a = diffuse.a * var_Color.a;
}