feat: Implement normal computation and enhance lighting for floor, ceiling, cube, and wall shaders

This commit is contained in:
2026-01-05 21:21:54 +00:00
parent ce0a6d8754
commit 748864b656
8 changed files with 60 additions and 5 deletions

View File

@@ -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);

Binary file not shown.

View File

@@ -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);
}

Binary file not shown.

View File

@@ -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);

Binary file not shown.

View File

@@ -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);

Binary file not shown.