合成的攝影學 - 第五章: 計算Nuke真實散焦
- 要甚麼程度的散焦才能對上實拍素材的攝影機?
大概會有人說,你就拿現有的工具作業就好啦,Nukepedia上面不是很多大神們提供的工具嗎,他們不是都有研究過也幫你寫好了公式了
恩對,就是有我這種不信邪想自行驗證到底原理是什麼的傢伙
通常大型工作室們也都有自己開發工具來達成寫實的景深,但只會使用工具的猴子我實在太好奇這些工具裡面的程式究竟原理是什麼
除了工作室自己有的工具,Nukepedia上有些神人們提供的Toolset或Gizmo
像是OpticalZDefocus,或是PxF_ZDefocus
以ZDefocus為主,這些工具在運算景深數值的公式上驚人的一致,雖說如此我當初在解析的時候也還是花了不少力氣把公式們各別簡化等等才歸類出結果
這篇的東西都是我閒的時候下去算的啦,大家看看就好
我們會在這篇文章中提到:
我先搞懂要餵給ZDefocus什麼東西
除了靠感覺調整參數以外,攝影機資訊都有的情況下可以去算ZDefocus數值吧
但是最大的障礙是,即使有了這些資訊依然還是不知道這個節點是怎麼運算的,我要餵給它什麼東西、
以下我們來稍微拆解一下我們在ZDefocus這個節點內會計算
我跟影片內容差異是,這上一篇和這篇針對的是Defocus裡的數字要多少這件事,這篇並不會講到散焦Bokeh設定
對照下方的圖,在ZDefocus節點中,有五個屬性直接關係到景深最後呈現在畫面中的效果,我會在後面順便提到剩下的屬性為何無關
- depth channel: 要讓ZDefocus拿去運算的深度值,很簡單,就是要真實距離的數值,
比如說deep. front中去sample的那些大部分都超過1的值, 代表的就是實際上攝影機到空間中那一個點的距離 - math: 上一點說到depth要真實的數值,但是實際上還是有幾種表現方式,比如說無限遠的數值可能是0,也可能是inf,math就是定義上面input的深度值怎麼轉換成與攝影機的距離。可以看Mark影片裡的範例
以上兩點只是補充,原理在Mark的影片講的很詳細,都有耐心看到這裡了拜託先把影片看完
- focal plane (C): 這個屬性的定義也十分簡單,就是在這個屬性內的數值絕對值會被認定在焦點上
- maximum: 先講這個屬性,因為等等size屬性要花一些篇幅解釋。如其字面意思,是取最大值,當size的數值大於maximum的時候,超過的部分會被壓至maximum
- size: 這個屬性我卡了很久,因為一直查不到填進去的數值跟實際造成失焦大小之間的關係。但把The Foundry官方解釋拉出來看的話: 「設定深度在無限遠距離的模糊blur大小」,重點在這個blur,如果再去對照Blur這個節點裡關於size大小的官方解釋: 「設定要進行模糊運算的半徑數值」,照這個解釋,要餵給ZDefocus的size屬性數值也會是我們根據攝影機資訊計算出的模糊圓半徑,這點我也同時跟開發PxF_ZDefocus的大神Xavier驗證過他的算式也是使用半徑,但我還是想驗證一下
下面三張圖是在ZDefocus其他因素已經排除,變數只有size的基礎下,用一個2*2的方塊(也是圓)以不同的半徑數值來比較
從比較圖中的數值來看,基本上ZDefocus的size屬性的確是照著Blur節點的size運作方式,以半徑去驅動像素模糊範圍
size設定19,模糊圓半徑也的確為19,同樣的結果在size等於29和60,驗證結束
但其中一個小發現是,隨著失焦程度越大,像素數值也會隨之降低之外,往外拓展的程度並不是size加1,模糊圓就往外長1像素,而是隨著數值增加,中間會出現間格性的停滯,比如說size 5之後要7才會繼續拓展;size 57後則是要到63才會開始繼續往外推。粗略推測應該是像素數值降低後,進行模糊運算的演算法不足把像素往外推
那為什麼有些紅框內的屬性不會影響?
因為focal point就是讓我們sample哪裡在焦點上,sample的數值會直接出現在focal plane欄中,所以如果清楚畫面中的對焦距離在哪裡,就不需要用到focal point手動對焦
至於output跟depth of field,因為我們後面會用到的公式已經把攝影機的景深範圍抓出來了,除非對這個”相對接近正確資訊”的結果還是不滿意,再來改output畫面調整depth of field
math的設置不同會有focal plane和size上的連動
1. 把math設為direct,focal plane為1,size為1
size的官方定義: 「如果把math設為direct,size的大小會乘上depth的數值來計算失焦大小,將size固定為1可以讓你直接使用depth數值作為模糊大小」
focal plane也設定為1的原因為既然是直接depth驅動,公式裡已經把focal plane計算進去了。這個方式需要另外新增NoOp節點作為攝影機的數值基準,用公式計算新的depth channel,Copy回去主線取代舊的depth數值,把math設為direct,size設為1,根據定義就是告訴ZDefocus,對焦點在focal plane的數值位置,直接用新的depth數值作為失焦的模糊大小
2. math設為depth,focal plane根據攝影機的實際對焦距離填入,size的欄位用公式計算後填入
兩個方式測試了下,只要攝影機資訊一致的情況下結果差不多
但上面的公式哪裡來,嘿 下面就來推導囉
所以那台攝影機的失焦到底要多糊
這些公式並不能非常精準的呈現每一台攝影機的散景,因為每個鏡頭內有多少個凸透鏡片、凹透鏡片除非拆解鏡頭不然無從得知,我們也不知道這些透鏡的折射率
因此我們計算的是一個概值,所以簡化整個流程讓透鏡只有一個,如下圖
A 為光圈直徑
f 為焦距
f₁ 為光圈到感光元件的距離
S₁ 為焦平面到光圈的距離
S₂ 為單點物體到光圈的距離
C 為單點物體映射到焦平面上的模糊直徑
c 為單點物體經過透鏡映射到感光元件上的模糊直徑
接著我們來跟著wikipedia對於這個的公式步驟,但首先要先釐清以下兩個名詞避免混淆
瀰散圓(Circle of Confusion),上一篇有提過,是指畫面的可接受失焦程度,對焦點前後相同大小的瀰散圓構成景深
模糊圈直徑(Blur Disk Diameter): 是指帶有景深的單點光源投射在感光元件上的圓的直徑。當模糊圈直徑在前景深和後景深的絕對位置上時等同於瀰遠圓直徑
公式中提到的都是模糊圈直徑
首先我們要先求出C,也就是「不在焦點上的單點映射在對焦平面上的模糊圓直徑」,根據三角形比例 C : S₂-S₁ = A : S₂
因此得出:
為了要展開上面這個公式,我們依照上面Wikipedia圖中同時得出其他三個簡單的透鏡公式,這些都是google “鏡頭方程式”,經過研究以及簡化的標準公式
- (單點映射在感光元件上的模糊圓直徑c) = (單點在對焦平面上的模糊圓直徑C) x (放大率m)
- (放大率m) = (光圈至感光元件的距離f₁) / (光圈到焦平面的距離S₁)
- 1/(焦距f) = 1/(光圈至感光元件的距離f₁) + 1/(光圈到焦平面的距離S₁)
- f值(N) = 焦距(f) / 光圈(A)
D指的是入射瞳直徑(Diameter of Entrance Pupil),但在這邊入射瞳直徑等於光圈大小,D=A
經過一連串的帶入和簡化後,會得到最後結果
如果在對焦距離有限的情況下想求無限遠的模糊圓直徑,S₂-S₁會等同於S₂,因為再更簡化公式後得到
好,我們算出了在感光元件上的模糊圓直徑,但這還不是最終要填入ZDefocus的數值,我們還必須依照感光元件大小和解析度的比例轉換成像素,最後在依循ZDefocus中size屬性規則除上2轉換半徑單位,如下圖
感光元件大小和解析度的關係只是比例,公式中是寬的長度比,也可以是高的長度比,或是斜對角比,結果是一樣的
把公式丟進Nuke看看長怎樣
我們就直接用實際的例子來看吧,以下用的是math為direct
第一組為攝影機為Nikon 750D + 鏡頭Nikkor 24-70 mm f/2.8
先放上實驗對象小聖誕樹放在離攝影機8公尺處並拍攝對焦照作為ZDefocus的基準,焦距分別為24 mm和70 mm,我也同時拍了焦平面分別定在0.5公尺、1公尺和2公尺的失焦圖後面作為對比
對焦距離: 500 mm、1000 mm、 2000 mm
物體距離: 8000 mm
f值: 2.8
感光元件大小: 35.9×24 mm
解析度: 6016×4016 px
第二組攝影機Sony A73 + 鏡頭FE 28-70 mm f/5.6
對焦距離: 500 mm、1000 mm、 2000 mm
物體距離: 8000 mm
f值: 5.6
感光元件大小: 35.6×23.8 mm
解析度: 6000×4000 px
以上是攝影機以及現場紀錄的資訊,其中物體距離在合成的應用中是depth channel,CG部門會提供。把這些資訊帶入公式的話
- 物體距離無限遠時
意思就是,以Nikon 750D拍攝,當焦平面在1公尺的距離時,在距離8公尺的物體應該要有半徑為137.575像素的模糊圓,而無限遠的物體應該要有半徑為157.228像素的模糊圓
注意無限遠的散焦不是模糊圓半徑的最大值,靠近攝影機的物體,模糊圓可能會更大
如果鏡頭的型號已知,可以查詢他們官網,在詳細資料中通常會列出最短焦距,套入公式就可以算出最大值的模糊圓半徑
上圖是針對Zdefocus的設置,還記得前面提到的怎麼驅動depth嗎? 忘記的可以點這個滑上去
拆解步驟就是:
- 利用expression計算公式後取代舊的depth channel
- math設為direct,size設為1(根據定義)
- 另外計算無限遠的公式放入模糊圓的最大值
比較圖,左邊為Nikon原生拍的,右邊為ZDefocus,為了方便識別失焦的部分有稍微加亮
左邊為Sony,右邊為ZDefocus
照理說ZDefocus中的size應該要是無限遠的公式啦,但是算出來用非無限遠的公式反而大小比較相近些
計算出這個基準數值後,如果需要繼續調整大小,大多情況應該只需要調整對焦距離。因為攝影機的光圈、焦距基本上不太會變動,而對焦距離是根據追蹤部門的抓出來的數據,且大多都設定在5公尺,有誤差的機率非常大,因此建議要調整的話由這一點著手
公式算出來的數值雖然不能說完完全全跟攝影機拍出來的一致,但至少是個沒人拿真實的景深圖來比就看不出來的程度,就算要手動的調整,我們也把變數縮到調整一個變數就可以了
有些部分就很難模仿,像真實的景深照中很多散焦的亮度是遠亮於ZDefocus仿製的圖,但這就是真實攝影中這些散焦都還是接受實際光源的亮度,而ZDefocus只能從沒有失焦、光源亮度還壓縮過的小小亮點去往外模糊。至於在比較圖裡面我們還有看到一些其他效果如貓眼、散焦的形狀和亮度等等就先不在本篇討論內