Plazma sayı 1, sayfa 47

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 47

OpenGL ya da Direct3D ile çalışırken texture stage'ler arasında da (multi-texturing yaptığınızı düşünün) blending yapabilirsiniz. Texture'ları oluşturan texel'ler blending hesaplamalarına girerler ve oluşan texel değerleri diğer pipeline seviyelerine (esasında eğer varsa per fragment operations'a, yoksa frame buffer'a) yollanır. Frame buffer ile blending'de ise blending hesaplamaları frame buffer'da yazılı olan pixel değerleri (destination, dst) ile pipeline'dan gelen (rasterizasyon ve texture mapping sonucu oluşan pixel'ler) yeni pixel değerleri (source, src) arasında olur. Bu hesaplamalar OpenGL pipeline'ının en sonunda "per fragment operations" denen kısımda olur ve alpha blending olarak bilinir. Alpha blending işlemi frame buffer okumaları (destination pixel'lerin de hesaba katıldığını unutmayın) da içerdiğinden çok sık yapılması önerilmez. Bizim yöntemimizde viewport'taki tüm pixel'lerle alpha blending yapacağız. Performans bakımından günümüz kartları için pek fazla sorun yok esasında. Source ve destination pixel'ler anlaşıldıysa blending faktörlerinin nasıl seçildiğine bakalım:

OpenGL'de Alpha Blending yaparken önce Blending state'ini glEnable(GL_BLEND); ile aktif hale getiririz. Sonra glBlendFunc(srcfactor,dstfactor); ile de source ve destination pikseller için blending faktörlerini ayarlarız.

Not: glBlendFunc'a argüman olarak srcfactor ve dstfactor yazdım. Bunu sadece ilk argümanın source pikseller için, diğerinin de destination pikseller için olduğunu belirtmek için yaptım. Bu argümanlar GL_ONE, GL_SRC_COLOR vs. gibi OpenGL'de tanımlı sabitler olacak. Bu sabitlerin tam listesi için OpenGL referanslarına bakın.

İşin matematiğine geçmeden önce belirtmem gereken bir şey var. Burada bahsedeceğim blending yöntemi additive blending diye bilinen yöntemdir. OpenGL spesifikasyonu sadece bir blending yöntemi tanımlar. O da additive blending'dir. Additive blending dışındaki yöntemler: subtractive (reverse subtractive) ve min-max blending yöntemleridir. Direct3D'de de bu yöntemler tanımlıdır. Mesela aşağıdaki kod parçası kullanılacak blend operasyonunu subtractive olarak seçer.

device->SetRenderState(D3DRS_BLENDOP,D3DBLENDOP_SUBTRACT);

Direct3D için SDK'da D3DBLENDOP Enumerated Type isimli kısma bakarak daha fazla bilgi edinebilirsiniz. OpenGL'e geri dönersek, OpenGL'de additive blending dışındaki yöntemler extension mekanizmasıyla programcıların kullanımına sunulmuştur. Genel blending yöntemlerini şöyle özetleyelim:

Kullanacağım notasyon şöyle olacak:

Cf --> Blending operasyonları sonucu oluşan renk (final color value) Cs --> Source pixel'in rengi Cd --> destination pixel'in rengi S --> Source pixel'in blend faktörü D --> Destination pixel'in blend faktörü

Additive Blending:

Cf = Cs * S + Cd * D olur ve if ( Cf > 1.0 ) Cf = 1.0 else if(Cf <= 1.0) Cf = Cf

Yukarıdaki if - else bloğuyla işlemin saturated olduğunu anlatmak istedim. Yani oluşan renk değerleri 1.0'ın üzerine çıkamaz.

Subtractive Blending:

Klavyeyle gezinmek için ← ve → tuşları.