mirror of
https://github.com/johndoe6345789/SDL3CPlusPlus.git
synced 2026-04-24 13:44:58 +00:00
feat: Implement normal computation and enhance lighting for floor, ceiling, cube, and wall shaders
This commit is contained in:
@@ -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.
@@ -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.
@@ -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.
@@ -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.
Reference in New Issue
Block a user