跳轉到內容

Blender 3D:菜鳥到專業/Cycles 中的螢火蟲問題

來自 Wikibooks,開放世界,開放書籍

看到那些小白點了嗎?(點選檢視全尺寸圖片,仔細觀察。)
螢火蟲消失了。

Cycles 是一款很棒的渲染器,能夠實現一些精美的燈光效果。然而,遲早你會遇到螢火蟲問題,它們是指散落在影像各個部分的孤立亮畫素。與簡單的噪點(可以透過增加渲染樣本數量來減少,或者透過簡單的濾鏡來減少)不同,螢火蟲是由渲染計算中的數值不穩定性造成的,因為畢竟計算機只能以有限的精度計算公式。它們似乎是試圖使用真實的物理公式來建立渲染結果的不可避免的結果。

但它們真的那麼不可避免嗎?實際上,我們可以使用各種技巧和調整來防止它們出現在渲染結果中。每種技術都有其優缺點(在工作量和不必要的副作用方面),因此由你決定使用哪種技術以及何時使用。

螢火蟲往往不會影響最簡單的渲染結果。這意味著需要花費一些工作來建立一個足夠複雜的教程示例來展示它們。如果你已經擁有一個被螢火蟲困擾的渲染結果,並且你來到這裡是為了尋找解決方法,那麼太好了——你可以直接跳到解決方案部分。否則,請耐心等待我們構建示例。

製作示例

[編輯 | 編輯原始碼]

這個示例源於我嘗試構建的一個真實模型:一棟帶有百葉窗的房子,百葉窗由磨砂玻璃製成。一些涉及光線穿過一面窗格,在房間的漫反射牆壁上反彈,然後從另一面窗格射出的互動作用,以及構成玻璃材質的著色器組合,導致了螢火蟲的出現。這個示例將把情況縮減到我能夠展示問題的最小程度,即兩個相鄰房間,帶兩個窗戶。

環切來劃分房間(從下面看)

新建一個 Blender 文件。將渲染器切換到 Cycles。選擇預設立方體,然後 TAB 進入編輯模式。將立方體水平方向稍微縮放一點,使房間不要太窄和太高。切換到面選擇模式。選擇底面並 DEL 刪除它。我發現房間需要天花板才能顯示螢火蟲,但不需要地板,所以為什麼不把它去掉呢?

給你的立方體新增一個 Solidify 修飾符,使牆壁具有非零厚度。確切的厚度並不重要。

房間之間的牆壁填滿了。

接下來,在形狀的側面做一個環切 CTRL + R ,以定義前室和後室之間的邊界。然後按 F ,新環的頂點應該連線起來,形成一個新的面,即房間之間的牆壁。

窗戶和門道切入牆壁。

現在我們需要為窗戶和房間之間的門道打孔。仍在面選擇模式下,選擇前面(你在 NUM1 檢視中看到的那個),然後 I 內插一點。如果你內插得太遠,你可能會發現高度變得太小,所以經過初始內插後,只需選擇中間面並水平縮放它 S + X ,以製作一個看起來合理的窗戶。

對前室右側的牆壁和房間之間的牆壁執行相同的操作。一個真正的門道會延伸到地板,但我們在這個練習中使用的牆壁上的簡單孔就足夠了。

新增窗戶

[編輯 | 編輯原始碼]
帶百葉窗的前窗。

新增一個新的水平平面。沿著 Y 軸縮小到其沿著 X 軸長度的 20%。新增兩個陣列修飾符:一個沿著 Z 軸,恆定偏移量大約為 0.2,數量約為六個;另一個沿著 X 軸,恆定偏移量約為 2.2,數量為 4。將你得到的百葉窗陣列放置在前窗的孔內。

螢火蟲的秘訣

在繼續之前,我們不能忘記將窗戶做成磨砂玻璃。將新的材質分配給你的窗戶物件。開啟節點編輯器,並按照右邊的設定建立一個窗戶玻璃的材質。將光滑 BSDF 的粗糙度設定為零,但請注意折射 BSDF 上的粗糙度設定很小,但不為零:我故意調整它以最大限度地生成螢火蟲。設定為零會導致螢火蟲消失,但這會失去這個練習的目的,對吧?

(房間牆壁可以保持 Blender 分配的預設漫反射材質。)

設定好窗戶材質後,複製你的百葉窗物件,旋轉並定位副本,使其位於側窗的孔內。將房間之間的孔留空(畢竟它一個門道)。

完成步驟

[編輯 | 編輯原始碼]

作為我們生成螢火蟲步驟的最後一步,將燈光物件的型別更改為太陽,並將角度更改為接近水平,使其照射到側窗。將其強度設定為 3。將相機的位置調整為直接看向前窗。此外,將渲染樣本數量增加到 100;這應該足以減少噪點。

因此,總而言之,我們有從前室側窗的百葉窗中以低角度照射進來的陽光,在前後房間之間反彈,然後從前窗的百葉窗中射出,所有百葉窗都是由略微磨砂的玻璃製成的。

螢火蟲!(點選仔細觀察。)

如果一切順利,按下 F12 進行渲染應該會生成右邊的影像。

解決問題 1:渲染調整

[編輯 | 編輯原始碼]
相關的渲染器設定

好的,現在我們已經可以製造問題了,我們如何解決它呢?

可能首先要嘗試的是一兩個渲染器設定。在渲染 上下文中查詢取樣和光線路徑面板,如右邊所示。在取樣面板中,查詢“Clamp”欄位。如果非零,則對每個畫素的光強計算施加一個最大值。通常 1.0 對應於全白,但某些點可能比這更亮。嘗試將預設值 0 更改為例如 3,然後重新渲染。

在我們這個簡單的示例中,這應該足以解決螢火蟲問題。然而,我遇到過一兩個情況,其中這會降低某些明亮的間接照明的強度,導致整體渲染結果顯得更柔和。

所以讓我們嘗試下一個方法。將 Clamp 設定回 0,這次在光線路徑面板中,查詢“No Caustics”複選框。焦散可能是逼真的燈光效果的重要組成部分,但如果你的場景不需要它們,停用它們可以幫助消除螢火蟲,並且可能加快渲染速度。但是,此複選框的工具提示警告說,結果可能會是更暗的影像。

在我們這個簡單的示例中,選中此複選框確實有效。

嘗試的第三個渲染器設定是“無焦散”(No Caustics) 勾選框下方的欄位,名為“過濾光滑”(Filter Glossy)。它對某些型別的燈光反彈進行故意模糊處理,犧牲了一點照明精度以避免出現螢火蟲。再次,在我們這種情況下,此選項有效:將其設定為例如 1 的值,確實可以修復螢火蟲。

但是,在某些時候,您可能會發現這三種技術都無法解決您的問題:它們可能對渲染沒有影響,或者可能在某些地方導致無法接受的質量損失。畢竟,由於這些設定適用於整個渲染,因此它們可能是一種比較粗糙的工具。

因此,為了進行下一步修復,我們需要求助於合成器。

解決問題 2:去斑點濾鏡

[編輯 | 編輯原始碼]

解決螢火蟲問題的方法是對渲染後的影像進行某種處理。如果您熟悉 Gimp 或 Photoshop 等影像編輯程式,您肯定見過去斑點濾鏡,它的作用就是專門平滑掉與影像其他部分不匹配的隨機點。原則上,您可以使用影像編輯程式來修補您的渲染(有些製作專業級渲染的人確實這樣做),但如果您要渲染動畫會發生什麼?想象一下,要手動修復數百甚至數千幀!

Blender 也有很多影像處理操作,可以在合成器中使用,包括去斑點濾鏡。而且,很棒的一點是,這些操作可以在渲染每一幀後自動應用。

在您的 Blender 文件中開啟一個節點編輯器 視窗(您可以重新使用預設窗口布局底部的“時間線” 視窗,只需稍微提高高度)。查詢圖示 ,它表示要編輯的節點型別:點選顯示小圖層或薄片的圖示,代表合成器(在 Blender 2.68 中位於中間,在早期版本的 Blender 中位於左側)。您應該立即看到一個“使用節點”(Use Nodes) 勾選框出現在這些圖示的右側:選中它以啟用基於節點的合成。您應該會獲得一個預設的節點設定,如右圖所示。

將兩個現有節點稍微拉開,以便在它們之間騰出空間放置一個新的節點。按下  SHIFT + A  調出“新增”選單,並在“濾鏡”(Filter) 子選單中查詢“去斑點”(Despeckle) 條目。將新的去斑點節點移到您之前清理的間隙中,如果定位正確,它應該會自動連線到鏈中,如下圖所示。

要檢視更改的效果,將 3D 檢視視窗切換到“影像編輯器”(Image Editor) 視窗。確保顯示的影像為“渲染結果”(Render Result)。在用於選擇影像槽位的選單(應該顯示“槽位 1”(Slot 1))旁邊,有一個用於選擇要顯示的影像層的選單:。“渲染層”(RenderLayer) 是渲染器提供的原始輸出,而“合成”(Composite) 是經過合成器處理後的結果。在兩者之間切換,您應該會發現預設的去斑點濾鏡設定已經刪除了一些螢火蟲,但不是全部。我發現如果將“閾值”(Threshold) 濾鏡引數從預設的 0.5 降低到類似 0.1 的值,那麼所有的螢火蟲確實都消失了。

去斑點濾鏡的工作原理

[編輯 | 編輯原始碼]

去斑點濾鏡專門用於去除孤立的異常畫素。這與模糊濾鏡不同,模糊濾鏡會將一堆畫素平均在一起,可能會將螢火蟲分散到更大的區域,而不是去除它。

但是,那些“閾值”(Threshold) 和“鄰近”(Neighbor) 引數究竟是什麼意思呢?以下解釋是根據對 Blender 原始碼的研究,主要是在source/blender/compositor/operations/COM_DespeckleOperation.cpp .

中進行的。正在處理的目標畫素與其八個鄰居進行比較。但是,這些鄰居並不等同對待:每個鄰居都獲得一個權重,用於控制其在計算中的相對重要性。水平和垂直鄰居的權重均為 1,而對角鄰居的權重較低,為 (大約為 0.7)。這反映了這樣一個事實,即它們沿對角線稍微遠一些,因此它們對結果的影響相應地更小。

對於每個鄰居畫素,“閾值”(Threshold) 輸入引數將與每個鄰居的 R、G 和 B 分量(歸一化為 0 為黑色,1 為最大亮度)與目標畫素的對應分量之間的差值進行比較;如果任何對應對的分量的差值超過閾值,則鄰居畫素值將累加到一個平均值(按鄰居權重加權)上,程式碼將其稱為color_mid_ok——如果你願意,可以認為它是目標畫素的“正確”值。所有鄰居畫素,無論是在閾值內還是閾值外,都累加到另一個(也加權)平均值上,稱為color_mid。值w是所有貢獻給color_mid_ok.

的鄰居的總權重。然後,值w除以所有鄰居畫素的總權重(4 × 1 + 4 × ),得到一個介於 [0.0 .. 1.0] 之間的分數,並將得到的分數與“鄰近”(Neighbor) 輸入引數進行比較。同樣,將color_mid(所有鄰居的平均值)的元件與原始目標畫素的元件之間的差值與“閾值”(Threshold) 進行比較。如果兩種比較都返回小於或等於,則認為畫素不需要校正。但是,如果兩種比較都大於,則目標畫素將從其初始值調整為color_mid_ok平均值,根據“Fac”輸入插座的值。如果“Fac”為 1.0(預設值),則畫素將完全替換為color_mid_ok;否則它將成為此值與其原始值的相應混合。

“Fac”可用於微調去斑點濾鏡的效果。例如,如果它來自一個反轉的邊緣檢測(“Kirsch”)濾鏡,那麼它可以用於減少沿尖銳邊緣的效果,因為這些邊緣可能會混淆濾鏡。

華夏公益教科書