diff --git a/shaders/ceiling.frag b/shaders/ceiling.frag index befc15c..2123bdd 100644 --- a/shaders/ceiling.frag +++ b/shaders/ceiling.frag @@ -10,6 +10,12 @@ float hash(vec2 p) { const vec3 SURFACE_BASE = vec3(0.98, 0.96, 0.1); +vec3 ComputeNormal() { + vec3 dx = dFdx(fragWorldPos); + vec3 dy = dFdy(fragWorldPos); + return normalize(cross(dx, dy)); +} + const vec3 LIGHT_POSITIONS[8] = vec3[8]( vec3(13.0, 4.5, 13.0), vec3(-13.0, 4.5, 13.0), @@ -41,6 +47,7 @@ void main() { baseColor *= mix(0.94, 1.04, speckle); baseColor *= mix(1.0, 0.84, gridLine); + vec3 normal = ComputeNormal(); vec3 ambient = AMBIENT_STRENGTH * baseColor; vec3 lighting = vec3(0.0); @@ -49,9 +56,14 @@ void main() { float distance = length(lightDir); lightDir = normalize(lightDir); float attenuation = calculateAttenuation(distance); - lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation; + float ndotl = abs(dot(normal, lightDir)); + lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation * ndotl; } + vec3 keyDir = normalize(vec3(-0.15, 1.0, 0.25)); + float keyNdotL = abs(dot(normal, keyDir)); + lighting += vec3(0.85, 0.95, 1.0) * keyNdotL * 0.28; + vec3 finalColor = ambient + baseColor * lighting; finalColor = clamp(finalColor, 0.0, 1.0); diff --git a/shaders/ceiling.frag.spv b/shaders/ceiling.frag.spv index 56b23b6..d2600fb 100644 Binary files a/shaders/ceiling.frag.spv and b/shaders/ceiling.frag.spv differ diff --git a/shaders/cube.frag b/shaders/cube.frag index eff525e..7dd61a4 100644 --- a/shaders/cube.frag +++ b/shaders/cube.frag @@ -4,6 +4,12 @@ layout(location = 0) in vec3 fragColor; layout(location = 1) in vec3 fragWorldPos; layout(location = 0) out vec4 outColor; +vec3 ComputeNormal() { + vec3 dx = dFdx(fragWorldPos); + vec3 dy = dFdy(fragWorldPos); + return normalize(cross(dx, dy)); +} + vec3 RainbowBand(float t) { t = fract(t); float scaled = t * 5.0; @@ -43,6 +49,19 @@ void main() { float bandPos = fragWorldPos.y * 0.35; float diagonal = (fragWorldPos.x + fragWorldPos.z) * 0.25; vec3 rainbow = RainbowBand(bandPos + diagonal); - vec3 shaded = mix(rainbow, fragColor, 0.08); - outColor = vec4(shaded, 1.0); + vec3 baseColor = mix(rainbow, fragColor, 0.08); + + vec3 normal = ComputeNormal(); + vec3 lighting = vec3(0.0); + + vec3 keyDir = normalize(vec3(-0.35, 1.0, -0.25)); + vec3 fillDir = normalize(vec3(0.45, 0.6, 0.2)); + float keyNdotL = abs(dot(normal, keyDir)); + float fillNdotL = abs(dot(normal, fillDir)); + + lighting += vec3(1.0, 0.92, 0.85) * keyNdotL * 0.9; + lighting += vec3(0.35, 0.45, 0.65) * fillNdotL * 0.4; + + vec3 finalColor = baseColor * (0.28 + lighting); + outColor = vec4(clamp(finalColor, 0.0, 1.0), 1.0); } diff --git a/shaders/cube.frag.spv b/shaders/cube.frag.spv index e4a4aa4..47301f4 100644 Binary files a/shaders/cube.frag.spv and b/shaders/cube.frag.spv differ diff --git a/shaders/floor.frag b/shaders/floor.frag index 7fd4c2a..7c74dd4 100644 --- a/shaders/floor.frag +++ b/shaders/floor.frag @@ -10,6 +10,12 @@ float hash(vec2 p) { const vec3 SURFACE_BASE = vec3(0.02, 0.95, 0.72); +vec3 ComputeNormal() { + vec3 dx = dFdx(fragWorldPos); + vec3 dy = dFdy(fragWorldPos); + return normalize(cross(dx, dy)); +} + const vec3 LIGHT_POSITIONS[8] = vec3[8]( vec3(13.0, 4.5, 13.0), vec3(-13.0, 4.5, 13.0), @@ -42,6 +48,7 @@ void main() { float pattern = mix(0.82, 1.08, checker) * mix(0.96, 1.04, grit); baseColor *= pattern; + vec3 normal = ComputeNormal(); vec3 ambient = AMBIENT_STRENGTH * baseColor; vec3 lighting = vec3(0.0); @@ -50,9 +57,14 @@ void main() { float distance = length(lightDir); lightDir = normalize(lightDir); float attenuation = calculateAttenuation(distance); - lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation; + float ndotl = abs(dot(normal, lightDir)); + lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation * ndotl; } + vec3 keyDir = normalize(vec3(-0.3, 1.0, -0.4)); + float keyNdotL = abs(dot(normal, keyDir)); + lighting += vec3(0.9, 0.95, 1.0) * keyNdotL * 0.25; + vec3 finalColor = ambient + baseColor * lighting; finalColor = clamp(finalColor, 0.0, 1.0); diff --git a/shaders/floor.frag.spv b/shaders/floor.frag.spv index ad26168..9a9c3ca 100644 Binary files a/shaders/floor.frag.spv and b/shaders/floor.frag.spv differ diff --git a/shaders/wall.frag b/shaders/wall.frag index 8de4928..92a9e0b 100644 --- a/shaders/wall.frag +++ b/shaders/wall.frag @@ -10,6 +10,12 @@ float hash(vec2 p) { const vec3 SURFACE_BASE = vec3(0.98, 0.18, 0.08); +vec3 ComputeNormal() { + vec3 dx = dFdx(fragWorldPos); + vec3 dy = dFdy(fragWorldPos); + return normalize(cross(dx, dy)); +} + const vec3 LIGHT_POSITIONS[8] = vec3[8]( vec3(13.0, 4.5, 13.0), vec3(-13.0, 4.5, 13.0), @@ -43,6 +49,7 @@ void main() { baseColor *= mix(0.92, 1.05, grain); baseColor *= mix(1.0, 0.78, groove); + vec3 normal = ComputeNormal(); vec3 ambient = AMBIENT_STRENGTH * baseColor; vec3 lighting = vec3(0.0); @@ -51,9 +58,14 @@ void main() { float distance = length(lightDir); lightDir = normalize(lightDir); float attenuation = calculateAttenuation(distance); - lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation; + float ndotl = abs(dot(normal, lightDir)); + lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation * ndotl; } + vec3 keyDir = normalize(vec3(0.35, 0.9, 0.2)); + float keyNdotL = abs(dot(normal, keyDir)); + lighting += vec3(1.0, 0.9, 0.8) * keyNdotL * 0.2; + vec3 finalColor = ambient + baseColor * lighting; finalColor = clamp(finalColor, 0.0, 1.0); diff --git a/shaders/wall.frag.spv b/shaders/wall.frag.spv index 6a9108c..8ff5e0b 100644 Binary files a/shaders/wall.frag.spv and b/shaders/wall.frag.spv differ