Bu sayfadaki yazılar
Sayfanın metni
Sayfa 49
Sınır koşulları için (Quad alpha değerinin 1 ve 0 olduğu durumlar) yukarıdaki blending eşitliğini yazarsak: Quad Alpha'sı = 1 (source pixel'lerin alpha'sı = 1) için, Sr = Sg = Sb = Sa = 1'dir ve Dr = Dg = Db = Da = 0'dır.
color = (Rs) , (Gs), (Bs) , (As) olur. Quad'ı görürüz.
Quad Alpha'sı = 0 için Sr = Sg = Sb = Sa = 0'dır ve Dr = Dg = Db = Da = 1'dir.
color = (Rd) , (Gd) , (Bd) , (Ad) olur ve sahneyi görürüz.
Benzer şekilde Fade out içinse Quad'ın alpha değerinin zamanla 0'dan 1'e gitmesi gerekir.
2) Render To Texture Yöntemi:
Bu yöntemin bir kısıtlaması var. Sadece siyah renk için fade in/out yapabiliyoruz (yani tüm ekranın siyaha gitmesi ya da siyahtan sahnenin görünür hale gelmesi gibi..).
Yöntemi anlatabilmek için OpenGL texturing fonksiyonları hakkında birkaç şey söylemem lazım. Texture mapping yaparken texture'ı uygulayacağınız yüzeyin rengini tamamen ihmal edebilirsiniz böylece yüzeyin rengi sadece texture map'ten gelir. Ayrıca bir yüzeyin rengini texture map'ten gelen renklerle modüle (çarpma) edebilirsiniz. Standart OpenGL size 4 tane dokulama fonksiyonu sunar. Bunlar GL_DECAL, GL_REPLACE, GL_MODULATE ve GL_BLEND. Bu fonksiyonlar glTexEnv{if}(......) komutu ile aktif hale getirilirler. Bu yöntemde GL_MODULATE'i kullanacağız.
Cf ---> sonuç renk değeri Cs ---> yüzeyin rengi Ct ---> texture map'te tutulan renk
Cf = Cs * Ct GL_MODULATE'in yapacağı işlem bu. Bu bilgiyi şöyle kullanacağız:
- Tüm sahne bir texture'a çizilecek. Yukarıdaki eşitlikteki Ct değeri bu. - Bir önceki adımda sahnenin çizildiği texture, bir screen aligned quad'a uygulanacak. Screen aligned quad Cs verisini tutuyor. - Mapping yapılırken glTexEnvf ( GL_TEXTURE_ENV , GL_TEXTURE_ENV_MODE , GL_MODULATE); komutu kullanılacak ve yüzeyin rengi :
Fade in için : 0'dan 1'e Fade out için : 1'den 0'a zamanla çekilecek.
Daha açık yazarsak şöyle bir işlem uygulanıyor :
(Rt,Gt,Bt) ---> Texture'un rengi. (Çizdirdiğiniz sahne) (Rs,Gs,Bs) ---> Texture'u uyguladığınız full-screen Quad'ın rengi.
Color = (Rt * Rs) , (Gt * Gs) , (Bt * Bs)
Sınır değerler için yukarıdaki eşitliği incelersek : (Rs , Gs, Bs) ---> (0.0,0.0,0.0) için : Color = (0.0) , (0.0) , (0.0) (siyah ekran)
(Rs,Gs,Bs) ---> (1.0,1.0,1.0) için : Color = (Rt) , (Gt) , (Bt) (sahne)
olur.
Quad'ın rengini mesela fade in için şu şekilde: glColor3f(t,t,t); (t değişkeni zamanla 0'dan 1'e götürülerek) ayarlanabilir.
Peki render to texture adımını nasıl yapabiliriz ? Opengl bize 3 farklı seçenek sunuyor. 1) glCopyTexImage yöntemi : Sahne backbuffer'a çizdirilir , backbuffer'a çizdirilen sahne glCopyTexImage ile bir texture'a kopyalanır. Backbuffer tekrar temizlenir (glClear (GL_COLOR_BUFFER_BIT); ) . Sonra yukarıda anlatılan yöntemler uygulanarak elde edilen texture screen aligned quad'a uygulanır. (En yavaş yöntem budur.)
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 48
Cf = Cs * S - Cd * D olur ve if ( Cf < 0.0 ) Cf = 0.0 else if (Cf >= 0.0) Cf = Cf
OpenGL için GL_EXT_blend_subtract extension'ına bakın.
Reverse Subtractive Blending:
Cf = Cd * D - Cs * S olur ve if ( Cf < 0.0 ) Cf = 0.0 else if (Cf >= 0.0) Cf = Cf ve yine GL_EXT_blend_subtract extension'ına bakın.
MinMax Blending:
minimum için:
Cf = min ( Cs , Cd ) olur.
Sonuç source ve destination piksellerin minimumudur.. Tabii bu işlemin renk bileşenleri (RGBA) bazında yapıldığını unutmayın.
maksimum için:
Cf = max(Cs, Cd) olur.
GL_EXT_blend_minmax extension'ına bakın.
Bu hatırlatmadan sonra esas konumuza geri dönelim. Additive Blending işlemi matematiksel olarak ağırlıklı toplamadan (weighted sum) başka bir şey değil. Matematiği ise şöyle:
Rs, Gs, Bs, As --> Tek bir source pixel'i belirten 4'lü olsun. Rd, Gd, Bd, Ad --> Tek bir destination pixel'i belirten 4'lü olsun.
Sr, Sg, Sb, Sa ---> Tek bir source pixel'in blend faktörlerini belirtsin (ağırlık parametreleri) Dr, Dg, Db, Da ---> Tek bir destination pixel'in blend faktörlerini belirtsin (ağırlık parametreleri)
Blending sonucu oluşan renk: color = (Rs * Sr + Rd * Dr) , (Gs * Sg + Gd * Dg) , (Bs * Sb + Bd * Db) , (As * Sa + Ad * Da)
Final RGBA değeri yukarıda görülüyor. Şimdi bu bilgi işimize nasıl yarayacak?
Not: Alpha değerinin 1 olması opaklık durumudur. Alpha değerinin 0 olması transparanlık durumudur.
Fade in durumunu ele alalım. Sahnemiz siyah ekrandan görünür hale gelsin. Şimdi böyle bir senaryoda ekrana çizdireceğimiz quad'ın renginin siyah olması, alpha değerinin de 1'den 0'a gitmesi gerekir (nedeni aşağıda detaylı olarak anlatılacak..). Çünkü böyle bir durumda:
Sahne --------> Destination Quad --------> Source olur ve blending faktörleri de GL_SRC_ALPHA ile GL_ONE_MINUS_SRC_ALPHA seçilir. Yani Sr, Sg, Sb, Sa 1'den 0'a gider (Quad'ın alpha'sını 1'den 0'a götürüyorduk unutmayın..) , Dr, Dg, Db, Da 0'dan 1'e gider çünkü bunlara 1 - Quad Alpha değeri atanır.