Ich implementiere Punktlichter in meiner Voxel-Engine und habe wirklich Mühe, einen guten Lichtfluss zu erzielen, von 100% in der Nähe der Lichtquelle bis 0% im Lichtradius.
Ich habe 5 Argumente für die Funktion:
- Lichtfarbe (Vec3)
- Lichtintensität (Abstand vom Licht bis zu einem Abstand von 100%)
- Entfernung vom Licht zum Fragment
- Der Winkel vom Fragment normal zum Licht
- Die Position des Lichts
Kann jemand mich in die richtige Richtung treiben, um eine Funktion für die Berechnung der Fragmentfarbe zu erstellen?
Bild von einem meiner Experimente:
Bearbeiten (aktueller Code wird von Byte angefordert) Beachten Sie, dass dies nur ein experimenteller Code von meiner Seite ist. Ich habe das float att von einer Website bekommen, und es funktioniert, aber alles andere als perfekt. :
void main()
{
// Light color
vec3 torchColor = vec3(1.0f, 1.0f, 1.0f);
float lightAdd = 0.0f;
for (int i=0; i<5; i++) {
vec3 pos = lights[i];
if (pos.x == 0.0f) continue;
float dist = distance(vertex_pos, pos);
if (dist < 9) {
float att=1.0/(1.0+0.1*dist+0.01*dist*dist);
vec3 surf2light = normalize(pos - vertex_pos);
vec3 norm = normalize(normal);
float dcont=max(0.0,dot(norm,surf2light));
lightAdd += att*(dcont+0.4);
}
}
vec3 textureColor = texture2D(texture, texture_coordinate).rgb;
vec3 torch_output = lightAdd * torchColor;
vec3 final_color = ((0.1+torch_output) * textureColor);
gl_FragColor = vec4(final_color, 1.0f);
}
if (dist < 9)
? Alternativ können Sie berechnen att
mit einer Funktion , die den Wert 1 zurück , wenn der Abstand 0 und 0 , wenn der Abstand 9. Egmix(1.0, 0.0, dist / 9.0)