Opaklık algoritması

Başlatan yamak, 03 Aralık 2011, 01:04:15

yamak

Merhaba arkadaşlar;
Şu menülerin transparanlık özelliğini nasıl bi algoritmayla yapıyolar. Ben şöyle düşünmüştüm; mesela bir kutucuğu transparan yapmak için bir pixel kutunun rengi bir pixel de arkadaki renkten basılırsa ekrana olabililir diye düşündüm sonra denedim ama olmadı şöyle ızgara gibi bişey çıktı ortaya :) . Acaba bu olay nasıl oluyo nasıl bi algoritama yazmak lazım.Biraz araştırdım alpha compositing diye bişey buldum ama tam anlamdım.

Burak B

#1
RGBilk = Öndeki Piksel
RGBikinci = Zemindeki Piksel

a = opaklık
0 <= a < 1,  olsun
RGBblended = a * RGBilk + (1 - a) * RGBikinci

veya

a = opaklık
0 <= a < 0xFF,  olsun
RGBblended = a * RGBilk + (0xFF - a) * RGBikinci <- Burada 0xFF yerine 0x100 kulanırsan SHL optimizasyonu için uygunluk sağlar. Çünkü 0xFF olmasada 0x100 iki nin katıdır. ;) 0xFF ile SHL kullanarak da  yaparsın ama teknik değişiyor.

MCU' yu yoran bir işlemdir. Her bir RGB bileşeni için yapılması gerekir. Optimize edilebilir. Sabit noktalı aritmetik kullanırsan ve çarpma işlemini uygun şekilde optimize edersen.
MUL komutu gibi çok saykıllı bir komut yerine daha hızlı bir SHL ile performansı daha da artırman mümkün.

Ayrıca bu formülde opaklık tüm katmana etki eder. Eğer "Per pixel Alpha Blending" diye tabir ettiğimiz piksel başına katıştırma yapmak istersen her bir pixel için ayrı bir katman daha bulundurmak/oluşturmak/kullanmak gerekir. Bunu sağlayan resim formatları mevcuttur en çok bilinenler PNG, TGA, TIF gibi formatlardır. GIF formatıda transparanlık bilgisini saklar ancak bu biraz daha farklıdır. Çünkü matte sorunu vardır ve per pixel değildir. Bence en uygun biçim PNG. Kullandığı sıkıştırma sayesinde az yer kaplıyor. Bu sıkıştırmayı çözmek v.s. gömülü sistemlerde bir miktar RAM gerektiriyor.

Örnek resimler(alıntıdır);


"... a healthy dose of paranoia leads to better systems." Jack Ganssle

yamak

Teşekkür ederim hocam deneyecem bunu :)