日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Alpha预乘-混合与不混合[转]

發(fā)布時(shí)間:2024/10/12 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Alpha预乘-混合与不混合[转] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者:John McDonald,于2013年1月31日上午07:57發(fā)布 標(biāo)簽:? GameWorks專家開發(fā)人員

?

Alpha Blending幾乎是每個(gè)3D應(yīng)用程序的一小部分,但卻很重要。從概念上講,alpha混合用于傳達(dá)表面的透明度。通常,消費(fèi)者應(yīng)用程序(游戲)傾向于使用RGB來傳達(dá)下層表面的顏色,依賴于alpha通道來指示該顏色的“不透明度”。更具體地說,當(dāng)在管道中啟用alpha混合時(shí),開發(fā)人員傾向于使用此表單進(jìn)行混合:

DestinationColor.rgb = (SourceColor.rgb * SourceColor.a) + (DestinationColor.rgb * (1 - SourceColor.a));

在舊的,固定的功能中,這將被稱為“SourceAlpha,InvSourceAlpha”;?也被稱為“后倍增α”。然而,這種形式的alpha混合存在一個(gè)嚴(yán)重的缺陷:在許多情況下它會(huì)導(dǎo)致錯(cuò)誤的顏色!最簡(jiǎn)單的這些情況可以通過一個(gè)簡(jiǎn)單的雙像素圖像來說明:

?

一個(gè)紅色像素,紅色= 1,alpha為1,綠色像素為綠色= 1,alpha為0.10

考慮上面的圖像,其分辨率為2x1像素。藝術(shù)家想要傳達(dá)的是,在綠色像素旁邊有一個(gè)紅色的不透明像素,它只會(huì)給它背后的物體帶來最輕微的綠色。但是,當(dāng)我們生成下一個(gè)mipmap級(jí)別1x1級(jí)別時(shí)會(huì)發(fā)生一些有趣的事情。結(jié)果可能令人驚訝;?生成的mipmapped紋素是這樣的:

?

RGBA =(0.5,0.5,0,0.55)

當(dāng)我們接近這個(gè)mipmap級(jí)別時(shí),我們將獲得與使用2x1級(jí)別時(shí)非常不同的結(jié)果 - 完全是因?yàn)槲覀儧Q定使用postmultiplied級(jí)別。您可以在以下圖片中看到這一點(diǎn):

?

?

? 規(guī)范圖像測(cè)試“mandrill”的三個(gè)版本。第一個(gè),原始的mandrill。第二個(gè)包含與我們的2x1圖像混合時(shí)的mandrill,最后一個(gè)與2x1紋理的1x1 mipmap混合。

輸入預(yù)乘的alpha

使用預(yù)乘的alpha,我們?cè)诖鎯?chǔ)之前首先將紋理組件乘以alpha組件。我們還修改了混合函數(shù),將SourceColor.a更改為One:

DestinationColor.rgb = (SourceColor.rgb * One) + (DestinationColor.rgb * (1 - SourceColor.a));

使用預(yù)乘的alpha,我們的原始紋理看起來像這樣:

?

我們的2x1紋理,準(zhǔn)備好預(yù)乘alpha。R =(1,0,0,1),G =(0,0.1,0,0.1)

此紋理的1x1 mipmap級(jí)別如下所示:

?

我們預(yù)乘的alpha紋理的1x1 mipmap。RGBA =(0.5,0.05,0,0.55)

這是很多更合理。我們?nèi)匀粊G失了一些信息(請(qǐng)注意,如果綠色組件足夠小,或者如果我們的精度太低,綠色將完全消失),但我們保留了更高分辨率的mipmap的意圖。為了比較,這里再次是圖像,增加了我們的預(yù)乘混合器:

?

?

?

?

??? 所有版本的mandrill。從上到下的順序,原始的mandrill,原始的mandrill由我們的預(yù)乘α2x1覆蓋,后乘α2x1,預(yù)乘1x1,最后是后乘1x1。

從我們的后乘世界過渡

方便地,從后乘的α管道到利用預(yù)乘的α的管道的轉(zhuǎn)換是微不足道的。在紋理保存時(shí)間或資產(chǎn)烘焙時(shí)間,甚至加載時(shí)間,將每個(gè)非alpha通道乘以alpha。那是:

OutputTexture.rgb = InputTexture.rgb * InputTexture.a; OutputTexture.a = InputTexture.a;

并且不要忘記修改“alpha混合啟用”以使用One作為Source Alpha值。如果我們將預(yù)乘的alpha插入到原始混合方程中,很容易看到切換到預(yù)乘的alpha會(huì)給出完全相同的結(jié)果:

DestinationColor.rgb = ((SourceColor.rgb * SourceColor.a) * One) + (DestinationColor.rgb * (1 - SourceColor.a));

所以你可能會(huì)問:如果結(jié)果相同,為什么還要加倍預(yù)乘?原因是紋理過濾。從紋理中獲取樣本時(shí),除非已禁用紋理過濾,否則硬件會(huì)將相鄰紋理像素混合在一起并返回加權(quán)平均值作為結(jié)果。使用傳統(tǒng)的后乘法alpha,此結(jié)果將不正確。

原文地址:https://developer.nvidia.com/content/alpha-blending-pre-or-not-pre

轉(zhuǎn)載于:https://www.cnblogs.com/xiaonanxia/p/9448383.html

總結(jié)

以上是生活随笔為你收集整理的Alpha预乘-混合与不混合[转]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。