feat: add lights

This commit is contained in:
2025-10-14 11:45:46 +02:00
parent c34d3f803f
commit 50a4f56e75
14 changed files with 355 additions and 10 deletions

View File

@@ -1,12 +1,68 @@
uniform int useTexture;
uniform sampler2D texSampler;
uniform int numLights;
uniform vec4 materialColor;
uniform float shininess;
uniform vec3 ambientLight;
struct Light {
vec4 vector;
vec3 color;
float intensity;
float linear_att;
};
uniform Light lights[10];
varying vec3 fcolor;
varying vec2 ftexcoord;
varying vec3 fnormal;
varying vec4 fposition;
void main() {
vec3 diffuseAccum = vec3(0.0, 0.0, 0.0);
vec3 specularAccum = vec3(0.0, 0.0, 0.0);
if (numLights > 0) {
diffuseAccum = ambientLight;
for (int i = 0; i < 10; i++) {
if (i >= numLights) break;
vec3 N = normalize(fnormal);
vec3 L = lights[i].vector.xyz;
float attenuation = 1.0;
if (lights[i].vector.w == 1.0) {
L = L - fposition.xyz;
float distance = length(L);
attenuation = 1.0 / (1.0 + lights[i].linear_att * distance);
}
L = normalize(L);
float NdotL = max(dot(N, L), 0.0);
diffuseAccum += NdotL * lights[i].color * lights[i].intensity * attenuation;
if (shininess > 0.0 && NdotL > 0.0) {
vec3 V = normalize(-fposition.xyz);
vec3 H = normalize(L + V);
float NdotH = max(dot(N, H), 0.0);
specularAccum += pow(NdotH, shininess) * attenuation * lights[i].color * lights[i].intensity;
}
}
}
vec4 fragmentColor;
if (useTexture == 1) {
gl_FragColor = texture2D(texSampler, ftexcoord);
fragmentColor = texture2D(texSampler, ftexcoord);
} else {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
fragmentColor = materialColor;
}
if (numLights > 0) {
gl_FragColor = vec4(fragmentColor.rgb * diffuseAccum + specularAccum, fragmentColor.a);
} else {
gl_FragColor = fragmentColor;
}
}