su an kafadan cikariyor olacagim hatalar olabilir.
asagidaki operasyonlarin anlamlari
. -> dot_product : (a,b,c) . (x,y,z) = ax + by + cz sonuc skalar
* -> component carpma: (a,b,c) * (x,y,z) = (ax, by, cz) sonuc vektor
+ -> vektor_toplama
renk = ambient_renk + diffuse_renk + specular_renk
ambient_renk = ambient_isik * ambient_material
diffuse_renk = diffuse_noktaya_varan_isik * diffuse_material (sabit renk olabilir veya texture'dan gelebilir)
specular_renk = specular_noktaya_vara_isik * specular_material(sabit renk olabilir veya texture'dan gelebilir)
diffuse_noktaya_varan_isik = isik_diffuse_renk * ( normalize_isik_vektor . normal ) * uzakliga_bagli_azalma
normalize_isik_vektor = norm(isik_vektor)
isik_vektor = isik_pozisyon - nokta_pozisyon
uzakliga bagli azalma sabit, linear veya quadratic secilebilir
sabit-> 1 / k0
linear-> 1 / k0 + k1*d
quad -> 1 / k0 + k1*d + k2*d*d
d = mag(isi_vektor)
specular_noktaya_varan_isik = isik_specular_renk * ( spec_vector . normal ) * uzakliga_bagli_azalma * specular_azalma
spec_vektor = ( isik_vektor + goz_vektor ) /2
goz_vektor = camera_pozisyon - nokta_pozisyon
Yani spec_vektor noktadan isiga ve goze giden vektorlerin aciortayidir. bu vektor, normale yaklastikca isik tam o noktadan bizim gozumuze yansiyor gibi oldugu icin ekstra bir "parlaklik" olusur.
specular_azalma = bu material'in "shininess" (matlik / cillopluk) degerine bagli bir deger. NVidia CG de bir math fonksiyonu var bunun icin
simdi son olarak isik kaynaginin turune gor ne degisiyor
1- noktasal isik: tam burada verdigimiz formuller birebir kullaniliyor
2- directional: uzakliga bagli azalma yok. o terimi 1 yapmak yeterli
3- spotlight: herseyden once spot konisinin icinde olunup olunmadigi kontrol edilmeli:
isik_yon_vektoru : spotun baktigi yon
ters_isik vektoru = nokta_pozisyon - isik_pozisyon
cos(aci) = norm(isik_yon_vektoru) . norm(ters_isik_vektoru)
aci <= spot_koni_tepe_acisi --> isik aliyoruz
aci > spot_koni_tepe_acisi --> isik almiyoruz
Per vertex vs Per pixel
Isiklandirma formulu her kosulda aynidir. sizin per pixel veya per vertex yaklasimlariniz formulleri degistirmez.
Degisen sizin hesaplamalarin ne kadarini vertex shader da yapip, ne kadarini pixel shader'a birakmanizdir
vertex shaderda yapacaginiz hesaplamalar pixellere interpole edilerek gecirilir ve bu yuzden biraz hata payi eklenir.
Texture lookuplari genelde pixel shaderda yaparsiniz
butun vektorleri (nokta_pozisyon, isik_vektoru, spec_vektoru, normal vs) vertex shaderda hesaplayip, pixel shader'a gecirdikten sonra iceride norm() komutunu kullanmalisiniz. Cunku interpole edilen vektorlerin boylari her zaman 1 olmayabilir.