J'implémente des lumières ponctuelles dans mon moteur Voxel et j'ai vraiment du mal à obtenir un bon flux de lumière, de 100% près de la source lumineuse à 0% au rayon lumineux.
J'ai 5 arguments pour la fonction:
- Couleur claire (Vec3)
- Intensité lumineuse (distance de la lumière jusqu'à la distance où la chute est de 100%)
- Distance de la lumière au fragment
- L'angle du fragment normal à la lumière
- La position de la lumière
Quelqu'un peut-il me pousser dans la bonne direction pour créer une fonction pour le calcul de la couleur du fragment?
Image d'une de mes expériences:
Edit (code actuel demandé par Byte) Notez que ce n'est qu'un code d'expérience de mon côté. J'ai obtenu le float att sur un site Web, et ça marche, mais loin d'être parfait. :
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)
? Alternativement, vous pouvez calculer att
avec une fonction qui renvoie 1 lorsque la distance est 0 et 0 lorsque la distance est 9. Par exemplemix(1.0, 0.0, dist / 9.0)