diff --git a/wadsrc/static/shaders/scene/lightmode.glsl b/wadsrc/static/shaders/scene/lightmode.glsl index 6b9dae2cd..86903761e 100644 --- a/wadsrc/static/shaders/scene/lightmode.glsl +++ b/wadsrc/static/shaders/scene/lightmode.glsl @@ -52,12 +52,15 @@ vec4 getLightColor(Material material) vec4 dynlight = uDynLightColor; + float sunlightAttenuation = 0.0; if (vLightmapIndex != -1) { - dynlight.rgb += texture(textures[nonuniformEXT(vLightmapIndex)], vLightmap.xy).rgb; + vec4 lightmap = texture(textures[nonuniformEXT(vLightmapIndex)], vLightmap.xy); + dynlight.rgb += lightmap.rgb; + sunlightAttenuation = lightmap.a; } - dynlight.rgb += ProcessSWLight(material); + dynlight.rgb += ProcessSWLight(material, sunlightAttenuation); frag.rgb = PickGamePaletteColor(frag.rgb + matColor * dynlight.rgb); return frag; diff --git a/wadsrc/static/shaders/scene/lightmodel_nolights.glsl b/wadsrc/static/shaders/scene/lightmodel_nolights.glsl index 0171f92e6..f95eab979 100644 --- a/wadsrc/static/shaders/scene/lightmodel_nolights.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_nolights.glsl @@ -11,7 +11,7 @@ vec3 ProcessMaterialLight(Material material, vec3 color, float sunlightAttenuati return material.Base.rgb * clamp(color + desaturate(dynlight).rgb, 0.0, 1.4); } -vec3 ProcessSWLight(Material material) +vec3 ProcessSWLight(Material material, float sunlightAttenuation) { return vec3(0.0); } diff --git a/wadsrc/static/shaders/scene/lightmodel_normal.glsl b/wadsrc/static/shaders/scene/lightmodel_normal.glsl index ffafa5742..981db54d6 100644 --- a/wadsrc/static/shaders/scene/lightmodel_normal.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_normal.glsl @@ -130,11 +130,17 @@ return frag; } - vec3 ProcessSWLight(Material material) + vec3 ProcessSWLight(Material material, float sunlightAttenuation) { vec3 normal = material.Normal; vec3 dynlight = vec3(0.0); + if (sunlightAttenuation > 0.0) + { + sunlightAttenuation *= clamp(dot(normal, SunDir), 0.0, 1.0); + dynlight.rgb += SunColor.rgb * SunIntensity * sunlightAttenuation; + } + #ifndef UBERSHADER #ifdef SHADE_VERTEX dynlight.rgb += vLightColor; @@ -171,7 +177,7 @@ return material.Base.rgb; } - vec3 ProcessSWLight(Material material) + vec3 ProcessSWLight(Material material, float sunlightAttenuation) { return vec3(0.0); } diff --git a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl index e308bd7ab..c0024c886 100644 --- a/wadsrc/static/shaders/scene/lightmodel_pbr.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_pbr.glsl @@ -224,7 +224,7 @@ vec3 ProcessMaterialLight(Material material, vec3 ambientLight, float sunlightAt return color; } -vec3 ProcessSWLight(Material material) +vec3 ProcessSWLight(Material material, float sunlightAttenuation) { return vec3(0.0); } diff --git a/wadsrc/static/shaders/scene/lightmodel_specular.glsl b/wadsrc/static/shaders/scene/lightmodel_specular.glsl index c40a48f3d..9442fed06 100644 --- a/wadsrc/static/shaders/scene/lightmodel_specular.glsl +++ b/wadsrc/static/shaders/scene/lightmodel_specular.glsl @@ -127,7 +127,7 @@ vec3 ProcessMaterialLight(Material material, vec3 color, float sunlightAttenuati return frag; } -vec3 ProcessSWLight(Material material) +vec3 ProcessSWLight(Material material, float sunlightAttenuation) { return vec3(0.0); } diff --git a/wadsrc/static/shaders/scene/material.glsl b/wadsrc/static/shaders/scene/material.glsl index a9ae94519..680feb26d 100644 --- a/wadsrc/static/shaders/scene/material.glsl +++ b/wadsrc/static/shaders/scene/material.glsl @@ -21,7 +21,7 @@ struct Material vec4 Process(vec4 color); void SetupMaterial(inout Material mat); vec3 ProcessMaterialLight(Material material, vec3 color, float sunlightAttenuation); -vec3 ProcessSWLight(Material material); +vec3 ProcessSWLight(Material material, float sunlightAttenuation); vec2 GetTexCoord(); Material CreateMaterial()