Saya menerapkan lampu titik di mesin Voxel saya, dan saya benar-benar berjuang untuk mendapatkan aliran cahaya yang baik, dari 100% di dekat sumber cahaya hingga 0% di radius cahaya.
Saya punya 5 argumen untuk fungsi ini:
- Warna terang (Vec3)
- Intensitas cahaya (jarak dari cahaya sampai jarak di mana falloff adalah 100%)
- Jarak dari cahaya ke fragmen
- Sudut dari fragmen normal ke cahaya
- Posisi cahaya
Adakah yang bisa mendorong saya ke arah yang benar untuk membuat fungsi untuk menghitung warna fragmen?
Gambar salah satu eksperimen saya:
Edit (kode saat ini diminta oleh Byte) Perhatikan bahwa ini hanya beberapa kode eksperimen dari pihak saya. Saya mendapat att float dari sebuah situs web, dan itu berfungsi, tetapi jauh dari sempurna. :
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)
? Atau Anda dapat menghitung att
dengan fungsi yang mengembalikan 1 ketika jarak adalah 0 dan 0 ketika jarak adalah 9. Misalnyamix(1.0, 0.0, dist / 9.0)