2012-08-17 39 views
9

Olası Çoğalt:
How to do alpha blend fast?Alfa Karıştırma 2 RGBA renkleri

alfa karışımı 2 RGBA (Tamsayı) renklerin en hızlı yolu nedir? Bir not olarak, karıştırmak için hedef renk olarak

hep opak, yalnızca ikinci renk şeffaflık farklı düzeylerde olabilir.

Ben harmanı nihai çıkan renk hiçbir şeffaflık, tamamen opak (alfa = 0xff)

+0

Bu bağlantı – PerracoLabs

+0

bize sorunuzu ve bu arasındaki farkı anlamaya yardımcı olabilir yardım etmiyor? Birçoğumuzun kafası karışmış gibi görünüyor. – sblom

+2

Yinelenen değil. Bu düz eski 'C' alfa karıştırma hakkında sorar. Söz konusu yinelenen soru, benzer bir soru soruyor, fakat 'C++' ile ilgili olarak. İki benzer ama çok farklı diller. –

cevap

13
int blend(unsigned char result[4], unsigned char fg[4], unsigned char bg[4]) 
{ 
    unsigned int alpha = fg[3] + 1; 
    unsigned int inv_alpha = 256 - fg[3]; 
    result[0] = (unsigned char)((alpha * fg[0] + inv_alpha * bg[0]) >> 8); 
    result[1] = (unsigned char)((alpha * fg[1] + inv_alpha * bg[1]) >> 8); 
    result[2] = (unsigned char)((alpha * fg[2] + inv_alpha * bg[2]) >> 8); 
    result[3] = 0xff; 
} 

ı don ile bitirmek gerektiğini dikkate alarak, C en hızlı yol bulmaya çalışıyorum Ne kadar hızlı olduğunu biliyorum, ama hepsi tamsayı. Alfa (ve inv_alpha) 8,8 sabit nokta gösterimlerine dönüştürerek çalışır. Alfa'nın min değerinin 1 olduğu konusunda endişelenmeyin. Bu durumda fg [3] 0'du, yani ön plan şeffaftır. karışımlar fg tüm bitleri sonucu üzerinden kaydırılabilir anlamına gelir 1 * fg + 256 * bg, olacaktır. Eğer 64 bitlik tamsayılar içinde RGBAs paketlenmiş eğer

Sen, gerçekten de çok hızlı yapabilirdi. Daha sonra üç sonuç rengini tek bir ifadeyle paralel olarak hesaplayabilirsiniz.

+1

Sadece mükemmel ve oldukça hızlı çalışır. – PerracoLabs

+2

Bunu duyduğuma sevindim - 2 am boşa iken, denenmemiş kodu için kötü değil? =] – Sniggerfardimungus

+1

1 Ben alfa harmanlama bugün büyük bir bölümünde işe gitmek için nasıl beynimi bozucu oldum. Algoritman, test ettiğim ilk şey aslında ... iyi, işe yarıyor. –