Tôi đang triển khai đèn điểm trong động cơ Voxel của mình và tôi thực sự đang nỗ lực để có được luồng ánh sáng tốt, từ 100% gần nguồn sáng đến 0% ở bán kính ánh sáng.
Tôi có 5 đối số cho hàm:
- Màu sáng (Vec3)
- Cường độ ánh sáng (khoảng cách từ ánh sáng cho đến khoảng cách 100%)
- Khoảng cách từ ánh sáng đến mảnh
- Góc từ mảnh bình thường đến ánh sáng
- Vị trí của ánh sáng
Bất cứ ai có thể đẩy tôi đi đúng hướng để tạo ra một hàm cho việc tính toán màu của mảnh?
Hình ảnh về một trong những thí nghiệm của tôi:
Chỉnh sửa (mã hiện tại do Byte yêu cầu) Lưu ý rằng đây chỉ là một số mã thử nghiệm từ phía tôi. Tôi đã nhận được float từ một trang web, và nó hoạt động, nhưng không hoàn hảo. :
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)
? Hoặc bạn có thể tính toán att
với một hàm trả về 1 khi khoảng cách là 0 và 0 khi khoảng cách là 9. Ví dụ:mix(1.0, 0.0, dist / 9.0)