cocos2dx 畫素黑邊處理
黑白邊產生的原因: 黑白邊的產生的原因——AA 抗鋸齒。渲染出來的圖都是點陣圖,點陣圖中只有完全水平或垂直的直線才有可能是所有畫素都是 100% 不透明的。任何斜線都必然帶有很多透明畫素才能讓視覺看起來像斜線。這就是抗鋸齒。 alpha 的兩種型別,直通和預乘 帶 alpha 的圖片有兩種計算方法:直通 alpha ( straight alpha ) 和預乘 alpha (premultiplied alpha)。 直通 alpha 圖片保留最原本的 RGB 數值;預乘 alpha,是原本的 RGB 資訊乘以 alpha 數值以後得到的結果(預乘就是預先乘以 alpha); 直通和預乘,是兩個逆運算的關係。原圖乘以 alpha 就是預乘結果,預乘結果除以 alpha 又得到直通結果。 直通和預乘的計算方式:
原因是這樣的,你匯入ps的圖片本身是這樣的。
這是三維軟體裡直接渲染出來的圖,是一種預乘型別的圖。也就是說,這圖已經被alpha乘過了,你就可以理解成已經被alpha扣過了。但是ps這個軟體吧,它理解不了這個事情,它以為世界上所有的圖片都是直通型別的,就是沒有過被alpha扣過的圖。也就是說,它以為這圖本身的背景就是黑色的。而其實這個圖是有一個黃色背景的。
然後,你在ps裡面做的事情是用alpha通道去扣這張圖,而這張圖原本其實是一張預乘的圖。或者說,這張圖已經被alpha扣過一次了,那麼你再去扣一次,會讓很多地方看起來比從前更黑,於是黑邊就這麼產生了。(在影象邊緣,有抗鋸齒的地方,抗鋸齒就是透明,我就不放大看了。)
而在ps裡面想要解決的方案是,把一張直通的圖導進去。
再用alpha去摳,才能得到正確的結果。
mental ray裡渲染得到直通圖的方法是勾除premultiply。vray裡無法實現。
PS中消除黑白邊的另外一個方法:
這一段內容呢,在提供方法的同時,更能夠加深你對alpha通道的理解。講得非常棒。
方法是把背景層給摳一個洞,是用的是前景層alpha的反向。前景層是用add(linear dodge線性增加)模式疊加在背景層上,也是可以得到完美的效果的。
原理是這樣的,前景層我麼用的是一張三維軟體裡面渲染出來,預設預乘了的圖。就相當於是A*alphaA,背景層原本是B,我們要得到正確的結果就要往公式上靠:
result=A*alphaA+B*(1-alphaA)
在ps裡面,正常疊加模式的公式其實是
result=A*alphaA+B*(1-alphaA)
我們一般的做法,把前景層用通道摳一次,直接用normal疊在背景上,得到的結果其實是:
result=A*alphaA*alphaA+B*(1-alphaA)
因為前景層本身就是A*alphaA;背景層是B。
add疊加模式的公式是:
result=A+B
如果直接把前景層用add模式疊在背景上,得到的結果是:
result=A*alphaA+B
視覺結果是過亮的。
為了得到正確的結果,我們需要手動把背景層反摳一個洞,模擬ps在做透明度合成時背後發生的事情,才能得到正確的結果。
當使用A圖層的alpha的反向去摳B圖層,則B圖層就變成了B*(1-alphaA)
最後的結果就變成:
result=A*alphaA+B*(1-alphaA)
這就是上圖我在ps裡做的事情,結果是非常正確的,只不過前景層很不好移動位置。因為要同時移動前景層和背景層的反向alpha(在我上面的圖中就是背景層的遮罩),我還真不知道怎麼能很方便地一起移動他們。
在AE及Nuke中解決alpha的問題:
因為ps它本身不是一個針對做三維合成使用者的後期軟體,所以在面對alpha問題的時候,能力很弱,解決起來很麻煩。但是在真正的能做合成的後期軟體中,解決起來是很方便的。
使用AE匯入TGA檔案,選擇預乘型別,背景色為你渲染的時候背景的顏色。問題就完美解決了。(注意,在分層渲染,分離前景的時候,要保證背景是純色,儘量是純黑,要是你墊在一個五顏六色的背景上渲染,之後又用alpha去摳,會摳不乾淨)
nuke導進去就是好的,預設預乘。
最後,這篇文章相當於是講解了最基本的alpha的一些概念。正好,看懂了以後,可以比較好地理解我昨天錄的視訊,來解決怎麼消除模型邊緣受強光照射時的奇怪鋸齒問題。