tr-demoscene

the scene => coding => Konuyu başlatan: spritus - 08.01.2005 18:55:00

Başlık: Alpha Nasıl Hesaplanır?
Gönderen: spritus - 08.01.2005 18:55:00
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?
Başlık: Alpha Nasıl Hesaplanır?
Gönderen: scg - 20.01.2005 15:35:48
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 :) :)
Başlık: Alpha Nasıl Hesaplanır?
Gönderen: spritus - 22.01.2005 00:06:34
ahanda bu soru cevaplanmış..
tnx scg

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

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