Estoy implementando luces puntuales en mi motor Voxel, y realmente estoy luchando por conseguir un buen flujo de luz, desde el 100% cerca de la fuente de luz hasta el 0% en el radio de la luz.
Tengo 5 argumentos para la función:
- Color claro (Vec3)
- Intensidad de la luz (distancia desde la luz hasta la distancia donde la caída es del 100%)
- Distancia de la luz al fragmento
- El ángulo del fragmento normal a la luz.
- La posición de la luz
¿Alguien puede empujarme en la dirección correcta para crear una función para el cálculo del color del fragmento?
Imagen de uno de mis experimentos:
Editar (código actual solicitado por Byte) Tenga en cuenta que este es solo un código de experimento de mi parte. Obtuve el float att de un sitio web, y funciona, pero lejos de ser perfecto. :
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)
? Alternativamente, puede calcular att
con una función que devuelve 1 cuando la distancia es 0 y 0 cuando la distancia es 9. Por ejemplomix(1.0, 0.0, dist / 9.0)