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.
#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:
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:
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