Gönderen Konu: Alpha Nasıl Hesaplanır?  (Okunma sayısı 12534 defa)

Alpha Nasıl Hesaplanır?

« : 08.01.2005 18:55:00 »
Hızlı düğmeleri aç

spritus

İleti: 933

Çevrimdışı
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info
sevgili coloring ve alpha ile ilgili herbişeyi biliyorum diyen arkadaşlar. üstüste binen rgb cinsinden 2 rengin karışımı yani alphası en hızlı ve kolay biçimde nasıl hesaplanır?

Alpha Nasıl Hesaplanır?

« Yanıtla #1 : 20.01.2005 15:35:48 »
Hızlı düğmeleri aç

scg

İleti: 214

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
Selam Spritus.
Sorunun için şunu deneyebilirsin:

24bit renk derinliğinde çalıştığını farz ediiyorum. Yani Alpha kanalin yok. ( R = 8bit
G = 8bit B = 8bit)
Mesela iki texture u blend edecen birbirleriyle.
Yapacağın şey lineer interpolasyon.

Kod: [Seç]
#define LERP (A,B,t) ((A) + ((B) - (A)) * (t))

Yukardaki makroyu tek boyutta düşün. Mesela x ekseninde x1 koordinatindan x2
koordinatina gidecen.

lerp = x1 + (x2 - x1) * t dersen t = 0 için x1 de , t=1 içinde x2 de olursun. t nin
izin verilen değeri [0...1] aralığı. Bu aralıkta herhangi bir t değeri için de x1 ve x2 arasinda bi koordinatta bulursun kendini. Ağırlıklı toplama yapıyon yani , t ağırlık parametresi..

Şimdi bu bilgiyi şöyle kullan:

s --> source imaj   d --> destination imajı belirten indisler.
Tek bir source pixeli : (Rs,Gs,Bs)
Tek bir destination pixeli : (Rd,Gd,Bd) tripleti ile belirtilsin.

Şöyle veri tiplerin olsun:
Kod: [Seç]

typdef struct _pixel
{
   unsigned char r,g,b;
}pixel;


typedef struct _image
{
   unsigned short width,height;
   pixel *p
}image;

Yapcağın şey şu:
destination imaj daki her pixel için:
  source pixel ile lerp uygula (her kanal için..)
    sonucu tekrar destination pixel e yazdir.

 Rd = Rd + (Rs - Rd) * t;
 Gd = Gd + (Gs -Gd) * t;
 Bd = Bd + (Bs - Bd) * t;

Kod olarak da şöyle bişeyler:
Kod: [Seç]
void Blend (image *src,image * dst,float t)
{
   unsigned int i,j;  unsigned int currentpixel = 0;
   for(i = 0;iheight;i++)
    {
       for(j = 0;jwidth;j++)
        {
           dst->pixel[currentpixel].r = (unsigned char)(LERP(dst->pixel [currentpixel].r,src->pixel[currentpixel].r,t);
          
            // Bu işlemi G ve B kanali için de yap...
           currentpixel++; // diğer pixel e geç..
        }
    }
}


şimdi t = 0 verirsen destination imajdasin.. t = 1 için source imajdasin..  ara değerlerde [ 0....1] bu iki imajin blend edilmiş halini elde edersin... Realtime da yapacaksan yani bu precalc falan değilse en hızlı çözüm olmadiği kesin.. MMX falan biliyosan asm ile de kasabilirsin.. Ve evet software rendering yaptığını farz ediyorum yine..

32 bit te çalışırsan bi de alpha kanali eklicen. Burda tranparanlik için gerekli
bilgileri tutarsin.. Merak ediyosan onun hakkında da bişeyler yazarim..
Umarim yardimci olur..

Ve unutmadan TBL rulezz :) :)

Alpha Nasıl Hesaplanır?

« Yanıtla #2 : 22.01.2005 00:06:34 »
Hızlı düğmeleri aç

spritus

İleti: 933

Çevrimdışı
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info
ahanda bu soru cevaplanmış..
tnx scg

şimdi de anlamaya çalışalım :)

görüyorum ki tbl bi fan daha kazanmış ;)