Я использую точечные источники света в своем двигателе Voxel, и я действительно изо всех сил пытаюсь получить хороший поток света, от 100% возле источника света до 0% в радиусе света.
У меня есть 5 аргументов для функции:
- Светлый цвет (Vec3)
- Интенсивность света (расстояние от света до расстояния, при котором спад составляет 100%)
- Расстояние от света до фрагмента
- Угол от фрагмента нормали к свету
- Положение света
Может кто-нибудь подтолкнуть меня в правильном направлении, чтобы создать функцию для расчета цвета фрагмента?
Изображение одного из моих экспериментов:
Edit (текущий код запрошен Byte) Обратите внимание, что это всего лишь экспериментальный код с моей стороны. Я получил float att с сайта, и он работает, но далеко не идеально. :
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)
? В качестве альтернативы можно вычислить att
с помощью функции , которая возвращает 1 , если расстояние равно 0 и 0 , если расстояние равно 9. Напримерmix(1.0, 0.0, dist / 9.0)