diff --git a/src/r_debug.cpp b/src/r_debug.cpp
index 7dc8b2c2ba803fadb7ba3a3259ad5a33e984ee19..f03ec22d16ffb1dceefa40a88f273bf0a7c0f2a0 100644
--- a/src/r_debug.cpp
+++ b/src/r_debug.cpp
@@ -41,12 +41,33 @@ void R_CheckDebugHighlight(debugrender_highlight_t k)
 
 INT32 R_AdjustLightLevel(INT32 light)
 {
-	constexpr fixed_t kRange = (LIGHTLEVELS - 1) * FRACUNIT;
+	constexpr INT32 kRangeCoarse = (LIGHTLEVELS - 1);
+	constexpr fixed_t kRange = kRangeCoarse * FRACUNIT;
 
 	if (!debugrender_highlight && cv_debugrender_contrast.value == 0)
 	{
-		const fixed_t darken = FixedMul(FixedMul(g_darkness.value[R_GetViewNumber()], mapheaderinfo[gamemap-1]->darkness), kRange);
-		return std::clamp<size_t>((light * FRACUNIT) - darken, 0, kRange) / FRACUNIT;
+		const fixed_t darken = FixedMul(
+			FixedMul(
+				g_darkness.value[ R_GetViewNumber() ],
+				mapheaderinfo[gamemap-1]->darkness
+			),
+			kRange
+		);
+
+		fixed_t factor = FRACUNIT;
+		if (darken > 0)
+		{
+			// Sal: Already dark areas don't need darkened nearly as much.
+			factor = FixedDiv(
+				light * light * light * light,
+				kRangeCoarse * kRangeCoarse * kRangeCoarse * kRangeCoarse
+			);
+		}
+
+		return std::clamp<size_t>(
+			(light * FRACUNIT) - FixedMul(darken, factor),
+			0, kRange
+		) / FRACUNIT;
 	}
 
 	const fixed_t adjust = FixedMul(cv_debugrender_contrast.value, kRange);