tft每日頭條

 > 生活

 > nukeatop算法啥意思

nukeatop算法啥意思

生活 更新时间:2025-02-04 11:44:45

寫在前面——緻從After Effects轉到Nuke的Boys & Girls

nukeatop算法啥意思(啥是預乘Nuke中的Premult)1

圖一——RGB通道

nukeatop算法啥意思(啥是預乘Nuke中的Premult)2

圖二——Alpha通道

nukeatop算法啥意思(啥是預乘Nuke中的Premult)3

圖三——預乘後的RGB通道

首先明确,在After Effects和Nuke中,RGB和Alpha通道都是相互獨立存在的。Ok,在After Effects中,在圖層上創建一個蒙版(Alpha),那麼在RGB上會立即體現出來(會被立即預乘)。而在Nuke中,在Alpha通道上做改動,不會立即對RGB産生影響,除非手動做出預乘的動作。比如,圖一RGB通道上是一位哲學家。如果在After Effects中, 對其Alpha進行改動,在上面畫上象征自由的印記♂ ,這時軟件自動預乘,此時RGB通道就會變成圖三。但是如果在此Nuke中進行此Alpha的修改,RGB不會有任何變化,仍保持圖一的狀态,但在此時加入預乘動作,圖一的RGB通道就會變成圖三,就達到了預乘的效果。

啥是預乘(Premult)?

在正式回答這個問題之前,我們先回顧一下預乘(Premultiply)的曆史——在上世紀CG行業剛剛興起時,CG圖像一般被渲染成兩個圖層(Pass),一是原生RGB層,它攜帶着每個像素的原生顔色信息(如圖),注意它是沒有抗鋸齒的,邊緣都是實打實的;二是透明度層,它攜帶着每個像素的透明度信息(如圖),比如抗鋸齒信息,動态模糊信息和半透明區域信息等。早期的合成師收到這兩個圖層後,會先将原生RGB層與透明度層相乘,以得到帶有抗鋸齒的圖像。後來,CG技術的進步使得透明度層可以作為一個通道(Channel)合并到了RGB層(Pass),也就成了我們現在所說的RGBA層(可以理解為直通Alpha圖像),但是這時合成師仍然需要将RGB通道與Alpha通道相乘以獲得抗鋸齒等效果;再得益于渲染技術的發展和特效制作流程的進步,渲染軟件執行了将原生RGB與Alpha相乘的任務,這樣渲染出來的圖像就帶抗鋸齒了。這時再給到合成師的CG圖像,在渲染階段已經做了原生RGB與Alpha相乘的流程,已經不需要合成師再做,他們管它叫做預先乘過的圖像(Premultiplied image),“預乘”這個詞從此出現,沿用至今。從算法上來說,預乘與普通的RGB與Alpha的乘法運算并無二緻,而因為這個曆史沿襲的叫法,隻要是RGB與Alpha相乘的這種運算都叫預乘了。我們再來回到預乘本身,用算法表示即:假如有通道值(R, G, B, A),那麼預乘之後通道值為(RA, GA, BA, A);在畫面(RGB)上最直觀的表現就是A值為1的部分被完全保留,A值為0的部分被完全抛棄(變為黑色),0-1部分按照值得到不同程度的呈現(如圖)。

為什麼要預乘?

1.使得畫面(RGB)能夠按照Alpha的指示進行正常顯示,這通常适用于素材沒有Alpha或者素材為直通Alpha的情況。

2.在合成中,預乘存在的意義還有順應Nuke的工作流程,比如在Merge的Over模式下,其算法為A B(1-a)(此時的A,B表示素材A,素材B,a表示素材A的Alpha),這就決定在某些流程中必須要預乘,否則就會出現圖像重疊等錯誤。

3.抗鋸齒,平滑邊緣。在處理直通Alpha圖像時,預乘的過程中就實現了平滑邊緣。不過,現在大多數CG軟件輸出的CG圖像都是預乘Alpha圖像而非直通Alpha圖像,注意對于預乘Alpha圖像不要再預乘,否則雙重預乘會造成邊緣黑邊的出現。

啥是預除(Unpremult)?

在算法上表示即:将已經預乘的圖像再除回去,假如有(RA, GA, BA, A),那麼反預乘/預除(Unpremult)之後,則為(R, G, B, A),在畫面上呈現就是它會給到最直觀的沒有半透明部分(Alpha影響)的RGB圖像。

為什麼要預除?

1.針對于已經預乘過的圖像,調色前和進行顔色空間轉換前需要進行反預乘,在調色完成後再預乘回去。為什麼需要這個步驟?主要有兩個目的:目的一:主要是為了避免黑白邊等邊緣破壞問題(是否預乘對于alpha為1的部分沒有影響)。假如我們有已預乘的邊緣像素RGBA值為(0.3, 0.3, 0.3, 0.5),如果我們直接用Grade調色節點Offset設為0.4,那麼此時的像素值為(0.7, 0.7, 0.7, 0.5);但是如果我們先用反預乘節點,此時像素值為(0.6, 0.6, 0.6, 0.5),我們再進行調色,此時像素值為(1, 1, 1, 0.5),然後再進行預乘,此時像素值為(0.5, 0.5, 0.5, 0.5)。現在有兩個值,一是未經反預乘調色的值(0.7, 0.7, 0.7, 0.5),二是經過反預乘調色的值(0.5, 0.5, 0.5, 0.5),一比二要更亮一些,這就是白邊出現的部分原因,并且在實際調色過程中運算遠不止加法這麼簡單,所以在調色前加入反預乘來避免邊緣破壞是很有必要的。那麼未經反預乘就調色犯了什麼錯誤呢?在于忽略了Alpha這個權重在畫面中的作用。目的二:還是假設要Offset 0.4,那麼如果在已經預乘的圖像上調色會發現原本RGBA都為0的黑色區域也提升了0.4,這顯然不是我們想要的結果,加入反預乘則會解決這個問題。

2.擴邊。這屬于Unpremult的一種特殊用法,在已預乘圖像的RGBA圖層進行Blur,然後再Unpremult,這是利用Unpremult擴邊的大緻思路。可以應用于擴邊,去除污點以及藍綠幕Cleanplate的制作等。

關于Read節點中的Premultiplied

在Read節點的Colorspace欄中,有Premultiplied選框。首先Nuke是在Linear的色彩空間中進行工作的,所以在讀取各種圖像文件時需要進行色彩空間的轉換,而這種轉換是通過特定的Lut來實現的,其實這也相當于一次調色,勾選Premultiplied框即告知Nuke此圖像是預乘過的,那麼Nuke在色彩空間轉換時會先反預乘,轉換完成後再預乘回去。可以解決素材導入時的邊緣破壞(黑白邊)問題。

寫在後面

預乘是一個曆史比較悠久的概念,筆者對其認識尚淺,且本文帶有較多的個人思考,難免纰漏之處,敬請指正。

作者:徐帥岐

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved