Kafayı yiyeceğim arkadaşlar. Normalde oyun geliştirirken, "şu sprite'ı şuraya koy, fizik kütüphanesi çarpışmayı hesaplasın" diye düşünürdüm. Ta ki Godot'da shader yazmaya başlayana kadar. Şimdi ekrandaki her bir pikselin bana karşı kişisel bir kin beslediğini düşünüyorum.
Matrisler ve Ben: Ruh İkizimiz
Diyelim basit bir dalga efekti yapacağım. Normalde "şu kodu kopyala yapıştır, çalışsın" mantığındaydım. Ama hayır. FRAGMENT SHADER denen şey, ekranınızdaki HER PİKSEL için ayrı ayrı çalışan bir fonksiyon. Şaka gibi ama, 1920x1080 bir ekran için bu fonksiyon 2 milyondan fazla kez çalışıyor her karede! Ve sen, o pikselin UV koordinatını, zamanı (TIME), bir sürü matris işlemini hesaplıyorsun.
Bu üç satırı yazarken, aslında 2 milyon piksele "kardeşim, senin x koordinatın şu, zaman şu, git şuradaki texture'dan rengini al ama y koordinatını şu kadar oynat" diye fısıldıyorsun. Bu güç... biraz korkutucu.
Debug Etmek? Unut Onu!
Shader'da hata ayıklamak, karanlık bir odada siyah bir kedi aramaya benziyor. Kedinin orada olup olmadığından da emin değilsin. StackOverflow'da bile bulamadığın hatalar. Ekran ya simsiyah oluyor, ya da neon pembesi bir kabusa dönüşüyor. Meğerse sorun, normalize etmeyi unuttuğun bir vektörmüş. Ya da float yerine int bölme yapıyormuşsun. O anki isyanımı anlatamam.
Aydınlanma Anı ve Bağımlılık
Ama bir kere mantığını çözdün mü, olay bitiyor. Ekranda gördüğün her efektin ardında, o piksellere verilmiş küçük matematik emirleri olduğunu bilmek... İnsanın dünyaya bakışını değiştiriyor. Artık yağmurlu bir camı, suyun yansımasını veya bir metal parıltısını görünce, "hmm bunun noise fonksiyonu ve dot product ile nasıl yapılır acaba?" diye düşünmekten uyuyamıyorum.
Siz de shader yazarken böyle bir matematik/felsefe krizi yaşadınız mı? Yoksa sakin sakin efektinizi yapıp geçiyor musunuz? Bu manyaklıkta yalnız olmak istemiyorum, itiraf edin!
Diyelim basit bir dalga efekti yapacağım. Normalde "şu kodu kopyala yapıştır, çalışsın" mantığındaydım. Ama hayır. FRAGMENT SHADER denen şey, ekranınızdaki HER PİKSEL için ayrı ayrı çalışan bir fonksiyon. Şaka gibi ama, 1920x1080 bir ekran için bu fonksiyon 2 milyondan fazla kez çalışıyor her karede! Ve sen, o pikselin UV koordinatını, zamanı (TIME), bir sürü matris işlemini hesaplıyorsun.
Kod:
vec2 uv = FRAGCOORD.xy / iResolution.xy;
float wave = sin(uv.x 10.0 + TIME) 0.1;
COLOR.rgb = texture(iChannel0, vec2(uv.x, uv.y + wave)).rgb;
Bu üç satırı yazarken, aslında 2 milyon piksele "kardeşim, senin x koordinatın şu, zaman şu, git şuradaki texture'dan rengini al ama y koordinatını şu kadar oynat" diye fısıldıyorsun. Bu güç... biraz korkutucu.
Shader'da hata ayıklamak, karanlık bir odada siyah bir kedi aramaya benziyor. Kedinin orada olup olmadığından da emin değilsin. StackOverflow'da bile bulamadığın hatalar. Ekran ya simsiyah oluyor, ya da neon pembesi bir kabusa dönüşüyor. Meğerse sorun, normalize etmeyi unuttuğun bir vektörmüş. Ya da float yerine int bölme yapıyormuşsun. O anki isyanımı anlatamam.
Ama bir kere mantığını çözdün mü, olay bitiyor. Ekranda gördüğün her efektin ardında, o piksellere verilmiş küçük matematik emirleri olduğunu bilmek... İnsanın dünyaya bakışını değiştiriyor. Artık yağmurlu bir camı, suyun yansımasını veya bir metal parıltısını görünce, "hmm bunun noise fonksiyonu ve dot product ile nasıl yapılır acaba?" diye düşünmekten uyuyamıyorum.
Siz de shader yazarken böyle bir matematik/felsefe krizi yaşadınız mı? Yoksa sakin sakin efektinizi yapıp geçiyor musunuz? Bu manyaklıkta yalnız olmak istemiyorum, itiraf edin!