摘要 近年來隨著圖形硬件的快速發(fā)展, 渲染技術(shù)和深度學(xué)習(xí)技術(shù)都飛速發(fā)展, 可微渲染作為二者之間的橋梁受到了廣泛關(guān)注. 隨著許多可微渲染方法的提出, 逆渲染等借助可微渲染工具的應(yīng)用也隨之蓬勃發(fā)展. 本文從傳統(tǒng)渲染管線開始介紹, 逐步引入可微渲染的主要思想、基本原理和方法, 對它們進(jìn)行介紹、分析和比較. 并介紹基于路徑跟蹤的可微渲染, 隨后列出開源的可微渲染工具供大家參考并進(jìn)行比較. 本文后半部分介紹可微渲染的廣泛應(yīng)用, 分為人臉、人體、人手和物體 4 個(gè)方面. 最后列舉了一些可微渲染可能的發(fā)展方向.
本文源自葉子鵬; 夏雯宇; 孫志堯; 易冉; 余旻婧; 劉永進(jìn), 中國科學(xué):信息科學(xué) 發(fā)表時(shí)間:2021-06-17
關(guān)鍵詞 可微渲染, 逆渲染, 三維重建, 人臉重建, 渲染
1 引言
渲染是從三維場景得到二維圖像的過程, 如圖 1 所示, 它在動畫、游戲、電影和虛擬現(xiàn)實(shí)中有豐富的應(yīng)用. 傳統(tǒng)的渲染理論和方法已經(jīng)趨于成熟, 在工業(yè)上已經(jīng)有許多成熟的軟件, 比如 OpenGL, 3ds Max 等. 在游戲行業(yè), 隨著圖形處理器 (graphics processing unit, GPU) 的發(fā)展, 已經(jīng)能夠?qū)崟r(shí)渲染高質(zhì)量高真實(shí)感的畫面. 在動畫和電影行業(yè), 基于物理的高真實(shí)感渲染能夠達(dá)到以假亂真的效果. 在計(jì)算機(jī)圖形學(xué)中, 一般用三角網(wǎng)格表示三維模型, 所以一般的渲染方法都是針對三角網(wǎng)格模型提出的. 除了一般的渲染方法之外, 還有許多專門針對某些特殊應(yīng)用的特殊渲染方法, 比如對體素 [1]、點(diǎn)云 [2]、毛發(fā) [3] 和流體 [4] 等的渲染. 本文只討論針對三角網(wǎng)格模型的渲染及其可微渲染, 所以渲染在本文中特指三角網(wǎng)格模型的渲染.
傳統(tǒng)的渲染模型分為局部光照模型和全局光照模型, 局部光照模型只考慮光源到物體表面的照射效果, 全局光照模型不僅考慮光源到物體的照射效果, 還考慮物體之間的相互影響. 最簡單的局部光照模型是蘭伯特 (Lambert) 模型, 它只考慮環(huán)境光和漫反射, 并假設(shè)物體朝著各個(gè)方向均勻地漫反射.
Phong 模型是影響深遠(yuǎn)的經(jīng)典局部光照模型, 它假設(shè)環(huán)境光是常量, 不考慮物體之間的相互反射, 只考慮環(huán)境光、漫反射和鏡面反射, 許多復(fù)雜的光照模型都是基于 Phong 模型改編而來的. 全局光照模型一般是基于物理的方法, 使用物理世界的規(guī)律來模擬計(jì)算光在各處的傳播和強(qiáng)度, 經(jīng)典的算法有輻射度法、光線跟蹤和光子映射. 這些全局光照模型的結(jié)果有非常高的真實(shí)感, 但時(shí)間花費(fèi)高. 為了實(shí)時(shí)渲染出高真實(shí)感的結(jié)果, 許多方法使用近似的全局光照, 比如使用預(yù)處理得到的環(huán)境光照, 為了適應(yīng)實(shí)時(shí)變化的光照, 一般使用球諧函數(shù)作為基底, 根據(jù)光照的變化來組合.
與渲染相反的過程叫做逆渲染, 該過程從圖片中獲得物體的形狀與材質(zhì)信息、場景中的光照信息及相機(jī)參數(shù)等. 逆渲染是個(gè)不適定問題, 比正向渲染難度大得多, 它不僅涉及到計(jì)算機(jī)圖形學(xué)中的許多問題, 也涉及到計(jì)算機(jī)視覺的很多問題. 為了正則化這個(gè)不適定問題, 一般會使用逆渲染對象的先驗(yàn)知識, 比如對于人體組成部分 (人臉[5∼17]、人體[18∼27]、人手[28∼31] ) 或是規(guī)則的人造物體[12, 19, 32∼44] . 對于某些特別的任務(wù), 對應(yīng)有專門的研究方向, 比如逆渲染人臉的研究方向稱為人臉重建. 近年來, 為了更好地解決逆渲染問題, 同時(shí)減少對訓(xùn)練數(shù)據(jù)的依賴, 許多可微渲染 (differentiable rendering) 的方法被提出 [9, 18, 19, 32, 45∼49] . 可微渲染是一個(gè)可以微分求導(dǎo)的渲染過程, 它的正向是渲染, 逆向是求像素對場景參數(shù)的微分. 由于傳統(tǒng)的渲染不可微, 難以設(shè)計(jì)基于優(yōu)化和基于深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的逆渲染方法, 可微渲染技術(shù)的提出大大地增加了這些方法的設(shè)計(jì)空間.
可微渲染是近年來的研究熱點(diǎn), 已經(jīng)建立了相應(yīng)的理論基礎(chǔ), 并且它的應(yīng)用也日益廣泛. 本文從傳統(tǒng)的抽象渲染管線 (第 2 節(jié)) 開始介紹, 逐步分析其中每個(gè)步驟, 然后介紹可微渲染的基本原理和主流方法 (第 3∼5 節(jié)) 以及開源的可微渲染工具 (第 6 節(jié)), 之后介紹可微渲染的應(yīng)用 (第 7 節(jié)), 最后介紹可微渲染未來可能的發(fā)展方向 (第 8 節(jié)). 最近已有關(guān)于可微渲染的綜述論文 [50] , 和文獻(xiàn) [50] 不同, 本文旨在讓讀者回顧傳統(tǒng)渲染管線, 快速地理解可微渲染的思想, 并可以迅速判斷可微渲染是否適合自己當(dāng)前的工作, 找到最適合的可微渲染方法以及開源工具.
2 傳統(tǒng)渲染管線
傳統(tǒng)渲染管線被抽象為幾個(gè)固定的步驟, 每個(gè)步驟有著固定且單一的任務(wù). 我們以 OpenGL 使用的可編程渲染管線 (本文中簡稱為渲染管線) 為例介紹傳統(tǒng)渲染管線, 它使用的是局部光照模型. 如圖 2 所示, OpenGL 的渲染管線依次分為頂點(diǎn)著色器、圖元裝配、幾何著色器、光柵化、片段著色器、測試與混合 6 個(gè)步驟. 在三角網(wǎng)格模型渲染過程中, 幾何著色器僅輸出三角片元, 假設(shè)不開啟深度測試和混合, 一個(gè)簡單的渲染管線如圖 3 所示, 它主要由頂點(diǎn)著色器、光柵化和片段著色器 3 個(gè)部分組成.
頂點(diǎn)著色器的輸入是模型的頂點(diǎn)屬性 (包括局部坐標(biāo)系的坐標(biāo)、法向、材質(zhì)等) 和全局的信息 (相機(jī)參數(shù)、光照等), 輸出是模型經(jīng)過變換之后的屬性 (全局裁剪空間的坐標(biāo)等). 頂點(diǎn)著色器負(fù)責(zé)對頂點(diǎn)進(jìn)行坐標(biāo)變換, 輸入的模型數(shù)據(jù)的頂點(diǎn)在局部空間, 需要乘以模型矩陣、視圖矩陣和投影矩陣再進(jìn)行透視除法和視口變換最終到屏幕空間. 其中模型矩陣、視圖矩陣和投影矩陣需要根據(jù)場景計(jì)算得到, 透視除法和視口變換和場景無關(guān), 會根據(jù)窗口大小自動處理. 模型頂點(diǎn)經(jīng)過這些變換后, 從局部空間, 依次到世界空間、觀察空間、剪裁空間、標(biāo)準(zhǔn)化設(shè)備坐標(biāo)系空間和屏幕空間. 頂點(diǎn)變換的過程包括平移、縮放、旋轉(zhuǎn)和投影, 均為線性變換, 天然可微, 所以可微渲染的方法一般會使用和上述完全相同的頂點(diǎn)變換的方法.
圖元裝配是把頂點(diǎn)裝配成不同的幾何結(jié)構(gòu) (比如三角形、折線段等), 一般我們輸入的模型是三角網(wǎng)格, 所以這一步把頂點(diǎn)裝配成一系列三角形. 幾何著色器的輸入是一個(gè)圖元及其頂點(diǎn), 輸出是一個(gè)或多個(gè)圖元, 一般用來做細(xì)節(jié)層次 (levels of detail).
光柵化是從圖元轉(zhuǎn)化為片段的過程, 也就是從幾何數(shù)據(jù)轉(zhuǎn)化為光柵顯示的像素的過程, 它計(jì)算與每個(gè)圖元 (對于三角網(wǎng)格是三角形) 相關(guān)的像素. 由于它是從連續(xù)空間到離散空間的一步轉(zhuǎn)化, 所以會帶來許多問題, 在傳統(tǒng)渲染技術(shù)中一個(gè)常見的問題就是反走樣 (也稱為抗鋸齒), 可微渲染的難點(diǎn)也在光柵化這一步驟, 但和反走樣不同的是, 困擾著我們的是另一個(gè)問題: 如何從像素對頂點(diǎn)求導(dǎo). 所有的可微渲染研究都是圍繞著這個(gè)問題進(jìn)行的, 我們將在第 4 節(jié)詳細(xì)介紹這個(gè)問題.
片段著色器負(fù)責(zé)計(jì)算出片段的顏色, 它使用一系列頂點(diǎn)屬性和全局的參數(shù). 我們首先找到片段所在的三角形并計(jì)算片段中心的重心坐標(biāo), 通過重心插值把頂點(diǎn)的屬性賦給每個(gè)片段. 為了實(shí)現(xiàn)不同的效果, 不同的著色器可能使用不同的算法來計(jì)算片段的顏色, 片段著色器是一個(gè)著色器程序的核心, 由用戶定義且可能非常復(fù)雜, 但可以將其計(jì)算過程抽象成一個(gè)黑盒, 輸入是插值得到的屬性和全局參數(shù), 輸出是片段的顏色. 比如紋理貼圖的過程, 使用插值得到的紋理坐標(biāo)和全局的紋理圖片, 通過采樣得到片段的顏色; 比如 Phong 模型, 使用插值得到的法向和材質(zhì)以及全局的光照參數(shù), 計(jì)算出每個(gè)片段的漫反射成分和鏡面反射成分, 并和常量環(huán)境光疊加得到片段的顏色; 比如投影歸一化坐標(biāo)碼 (projected normalized coordinate code, PNCC)[51] , 它利用一張圖片的三通道顏色來表示三維模型的三維坐標(biāo), 我們可以通過片段著色器直接輸出該片段插值得到的三維坐標(biāo)來得到. 由于片段著色器可以非常復(fù)雜, 可能包含可微的過程和不可微的過程, 所以可微渲染的方法一般會對這個(gè)步驟加以限制, 只采用可微的片段著色器. 因?yàn)樵S多常用的模型都是天然可微的, 只要稍加限制, 這個(gè)步驟往往無需修改即可應(yīng)用到可微渲染中.
測試與混合是處理物體之間的遮擋關(guān)系以及透明物體和它背后其他物體如何顯示的問題, 本質(zhì)上都是處理物體重疊時(shí)產(chǎn)生的問題, 一般采用 Z-buffer 算法來解決. Z-buffer 算法對每個(gè)像素維護(hù)一個(gè)深度信息的緩沖區(qū), 每次判斷新片段的深度和緩沖區(qū)內(nèi)的深度, 保留更靠前的片段. 由于遮擋關(guān)系對頂點(diǎn)坐標(biāo)敏感, 但 Z-buffer 算法本身不可微, 所以這一步也為渲染的可微帶來了一個(gè)障礙. 為了解決這個(gè)問題, 需要對這一步驟進(jìn)行修改, 我們將在第 4 節(jié)詳細(xì)介紹這個(gè)問題.
3 可微渲染的基本原理
在介紹可微渲染的方法之前, 我們首先簡要地介紹可微渲染的基本原理. 可微渲染是可以微分求導(dǎo)的渲染過程, 分為正向和逆向的過程, 正向過程和傳統(tǒng)渲染相同, 輸入模型和參數(shù)得到一張圖片, 逆向是像素對場景參數(shù)求導(dǎo)數(shù), 可微渲染需要兼具這兩個(gè)過程, 不僅需要得到渲染結(jié)果, 還要得到渲染結(jié)果對輸入的導(dǎo)數(shù). 可微渲染不能離開傳統(tǒng)的渲染模型, 但傳統(tǒng)的渲染方法不可微, 所以可微渲染往往是基于某種傳統(tǒng)渲染模型, 通過引入新的技術(shù), 使得我們可以得到渲染結(jié)果對輸入的導(dǎo)數(shù). 主流的可微渲染方法往往基于以下兩類思想, 一類是使用近似的方法, 求得近似導(dǎo)數(shù)用于反向傳播; 另一類是改編傳統(tǒng)渲染模型, 讓像素對頂點(diǎn)可導(dǎo).
上述第 1 類方法不改變傳統(tǒng)渲染的正向過程, 雖然傳統(tǒng)渲染方法天然不可微, 但使用近似的方法, 能求得近似導(dǎo)數(shù)用于反向傳播. 這類方法的核心在于如何更好地近似渲染過程的導(dǎo)數(shù), 使得導(dǎo)數(shù)在某種觀點(diǎn)下是一種有效的近似, 或是使得導(dǎo)數(shù)對優(yōu)化輸入有著指導(dǎo)意義. 為了使得導(dǎo)數(shù)對優(yōu)化輸入有著指導(dǎo)意義, 有時(shí)導(dǎo)數(shù)會和應(yīng)用相關(guān), 會根據(jù)損失函數(shù)的不同而不同.
對于上述第 2 類方法, 由于傳統(tǒng)渲染方法天然不可微, 需要對其進(jìn)行改編, 使得改編后的渲染方法依然擁有渲染的能力, 渲染結(jié)果不發(fā)生較大變化, 但其過程完全可微, 可以求得精確導(dǎo)數(shù). 這類方法通常改編其中光柵化的步驟, 因?yàn)檫@一步從連續(xù)空間映射到離散空間, 是導(dǎo)致傳統(tǒng)渲染不可微的原因.
4 基于局部光照模型的可微渲染
最近, 許多工作使用近似的方法, 求得近似導(dǎo)數(shù)用于反向傳播 [9, 18, 32] , 或是改編了傳統(tǒng)渲染管線中的步驟 (一般是光柵化和測試與混合步驟), 讓像素對頂點(diǎn)可導(dǎo) [19, 45∼47] . 本節(jié)我們會詳細(xì)介紹幾種有代表性的可微渲染的方法及其理論, 從近似傳統(tǒng)渲染方法的導(dǎo)數(shù)逐漸過渡到改編渲染方法, 然后簡要介紹其他可微渲染的方法, 并將這些可微渲染方法進(jìn)行對比分析. 它們都使用局部光照模型, 和 OpenGL 的渲染管線有著類似的步驟. 我們稱渲染的過程為正向過程, 求導(dǎo)的過程為反向過程.
4.1 局部近似導(dǎo)數(shù)的方法
OpenDR [18] 提出了一種對渲染過程求近似導(dǎo)數(shù)的方法, 求得近似導(dǎo)數(shù)用于反向傳播. 它對渲染過程進(jìn)行了一定的限制, 傳統(tǒng)的渲染管線中, 片段著色器是使用用戶定義的函數(shù)逐片段地確定顏色, 而 OpenDR 要求顏色是逐頂點(diǎn)確定的, 頂點(diǎn)的顏色在光柵化之前已經(jīng)計(jì)算完成, 之后片段著色器只是對頂點(diǎn)顏色進(jìn)行插值得到片段的顏色. 雖然它限定了計(jì)算顏色的過程, 但無需修改光柵化的過程. 假設(shè)渲染的輸入為模型的幾何信息 (V ), 模型的外表信息 (A) 和相機(jī)參數(shù) (C), 其中模型的外表信息可能受到幾何信息的影響, 如圖 4 所示, 渲染過程為 f(V, A, C), 正向過程從模型的數(shù)據(jù)和相機(jī)參數(shù)得到圖片, 逆向過程分別求出 f 對 V, A, C 的導(dǎo)數(shù). 設(shè) U 為模型頂點(diǎn)投影到屏幕上的坐標(biāo), 可以理解為頂點(diǎn)著色器的輸出, 它可以由模型的幾何信息和相機(jī)參數(shù)計(jì)算得到.
如圖 4 所示, 為了求得 f 對 V, A, C 的導(dǎo)數(shù), 由鏈?zhǔn)椒▌t, 我們總共需要求 ∂f ∂A , ∂f ∂U , ∂U ∂V , ∂U ∂C , ∂A ∂V 五組偏導(dǎo)數(shù). 由于其中 ∂U ∂V 和 ∂U ∂C 是頂點(diǎn)變換, 天然可微. 對于 ∂f ∂A , 由于 OpenDR 對頂點(diǎn)顏色進(jìn)行插值得到片段的顏色, 所以像素對頂點(diǎn)顏色的導(dǎo)數(shù)就是該像素對應(yīng)的可見片段在其三角形的重心坐標(biāo), 我們只需在正向過程中保存每個(gè)片段的重心坐標(biāo)以及每個(gè)像素對應(yīng)的可見片段即可. ∂A ∂V 是對用戶定義的函數(shù)求導(dǎo), 它可能是常數(shù)也可能是復(fù)雜的函數(shù), 這取決于用戶如何定義計(jì)算顏色的函數(shù), 只要用戶定義的函數(shù)可微, 那么它的導(dǎo)數(shù)存在. 通常用戶定義的計(jì)算顏色的函數(shù)都是初等函數(shù), 導(dǎo)數(shù)很容易計(jì)算. 下面我們詳細(xì)介紹對 ∂f ∂U 的計(jì)算.
由于從 U 到 f 需要經(jīng)過光柵化和測試與混合, 所以 ∂f ∂U 是天然不可微的, 而 OpenDR 不改變光柵化和測試與混合的步驟, 而是求近似導(dǎo)數(shù). OpenDR 根據(jù)像素和遮擋邊界的關(guān)系, 把像素分為內(nèi)部像素和邊界像素, 邊界像素包含遮擋邊界, 內(nèi)部像素不包含遮擋邊界. 遮擋邊界是一條邊在屏幕上的投影, 且其兩側(cè)對應(yīng)的曲面發(fā)生了劇烈的變化, 這往往分為兩種情況: 一種是在深度測試的過程中發(fā)生了突變 (由遮擋產(chǎn)生), 另一種是這條邊連接了兩個(gè)法向相反的三角形 (由輪廓產(chǎn)生). OpenDR 具體又根據(jù)像素跨越遮擋邊界的數(shù)目, 將它們分為三類: 內(nèi)部像素、單邊界像素和多邊界像素, 對這三類像素分別討論, 采用不同的方法近似. 其中內(nèi)部像素的范圍內(nèi)不包括遮擋邊界; 單邊界像素僅和一個(gè)遮擋邊界相交; 多邊界像素和超過一個(gè)遮擋邊界相交. OpenDR 采用圖像空間的一階泰勒 (Taylor) 展開的方法來近似顏色對水平方向的導(dǎo)數(shù), 考慮模型的局部往右移動了一個(gè)像素的距離, 那么每個(gè)相關(guān)的像素都被它左邊的像素替代. 我們可以用相鄰像素之差來近似導(dǎo)數(shù), 以水平方向?yàn)槔? 比如用 1 2 [−1, 0, 1] 來濾波, 這個(gè)過程和對圖像做一次 Sobel 濾波非常類似, 實(shí)現(xiàn)的時(shí)候也可以用類似的方法來實(shí)現(xiàn).
至此, 我們已經(jīng)求出或近似求出了所需的五組導(dǎo)數(shù), 梯度流得以從輸出傳遞回輸入. OpenDR 采用的近似導(dǎo)數(shù)的方法不改變渲染過程, 使用像素之間的離散導(dǎo)數(shù)來近似頂點(diǎn)坐標(biāo)的變化對像素產(chǎn)生的影響. 我們發(fā)現(xiàn), 這五組導(dǎo)數(shù)中最復(fù)雜的是 ∂f ∂U , 因?yàn)楣鈻呕烊徊豢晌? 導(dǎo)致梯度流無法從像素傳播到頂點(diǎn)坐標(biāo). 之后介紹的方法, 它們都是圍繞光柵化這個(gè)步驟進(jìn)行近似或改編的, 從而使梯度流能夠從像素傳播到頂點(diǎn)坐標(biāo).
4.2 用平滑的光柵化近似導(dǎo)數(shù)
如圖 5 所示, 標(biāo)準(zhǔn)的光柵化像素對頂點(diǎn)坐標(biāo)沒有梯度流 (導(dǎo)數(shù)幾乎處處為 0), 為了使得像素對頂點(diǎn)坐標(biāo)的梯度流存在, 一種平滑的光柵化方法 [32] 被提出, 它不改變正向渲染的過程, 而是在反向傳播梯度流時(shí), 通過把頂點(diǎn)移動對像素的影響進(jìn)行平滑, 得到一種近似像素對頂點(diǎn)坐標(biāo)導(dǎo)數(shù)的方法, 下面將詳細(xì)介紹這種平滑的光柵化方法.
假設(shè)我們要得到某個(gè)像素 Pj 的顏色 Ij 對某個(gè)頂點(diǎn) vi 的屏幕空間的坐標(biāo) (xi , yi) 的導(dǎo)數(shù), 這里只討論水平方向的導(dǎo)數(shù), 對于垂直方向的微分完全類似. 我們考慮頂點(diǎn) vi 在沿著水平方向移動時(shí), 該像素顏色的變化, 對于標(biāo)準(zhǔn)的光柵化, 如圖 5 第 2 行所示, 隨著頂點(diǎn)位置的變化, 像素的顏色在某個(gè)臨界位置發(fā)生了突變. 如果三角形的顏色與頂點(diǎn)位置 vi 無關(guān), 那么 ∂Ij ∂vi 幾乎處處為 0, 損失函數(shù)得到的誤差無法從像素的顏色傳播到頂點(diǎn)的坐標(biāo). 梯度流無法傳播的根本原因在于, 顏色沒有隨著頂點(diǎn)坐標(biāo)平滑地變化, 而是所有的變化都集中在發(fā)生突變的地方. 基于這一點(diǎn), 平滑的光柵化相對標(biāo)準(zhǔn)的光柵化, 在頂點(diǎn)移動時(shí)像素發(fā)生突變的地方進(jìn)行平滑, 如圖 5 第 4 行所示, 在初始位置和臨界點(diǎn)之間使用了線性插值. 下面分兩類情況給出詳細(xì)定義, 一類是像素初始在三角形外, 另一類是像素初始在三角形內(nèi).
當(dāng)像素初始在三角形外時(shí), 如圖 5 左半部分所示. 我們記 vi 的初始位置為 x0, 此時(shí) Pi 的顏色為 I(x0), 當(dāng) vi 向右移動到 x1 時(shí), 三角形的邊和像素接觸, 此時(shí) Pi 的顏色為 I(x1), 我們記 δ x i = x1 − x0, δ I j = I(x1) − I(x0), 我們將突變改為漸變, 也就是在 x0 和 x1 之間用 δ I j δ x i 來近似 ∂Ij ∂vi . 由于 x0 是一個(gè)拐點(diǎn), 在 x0 的導(dǎo)數(shù)的定義需要特別定義, 其實(shí)我們最關(guān)心的正是導(dǎo)數(shù)在 x0 處的定義. 為了讓梯度流更好地傳播, 在 x0 的導(dǎo)數(shù)如下定義:
其中 δ P j 為損失函數(shù)反向傳播的梯度信號, 它表示該像素是否過量或過暗. 梯度信號 δ P j > 0 表示, 為了優(yōu)化損失函數(shù)像素需要更暗. 如果頂點(diǎn)向右移動, 像素會變得更亮, 即 δ I j > 0, 但為了優(yōu)化損失函數(shù)像素需要更暗, 即 δ P j > 0, 此時(shí)向左向右移動均無效, 所以在這種情況下, 導(dǎo)數(shù)定義為 0.
當(dāng)像素初始在三角形內(nèi)時(shí), 如圖 5 右半部分所示. 我們記 vi 的初始位置為 x0, 此時(shí) Pi 的顏色為 I(x0), 當(dāng) vi 向左移動到 x a 1 時(shí), 三角形的邊和像素接觸, 此時(shí) Pi 的顏色為 I(x a 1 ), 我們記 δ a x = x a 1 − x0, δ I a j = I(x a 1 ) − I(x0), 當(dāng) vi 向右移動到 x b 1 時(shí), 三角形的邊和像素接觸, 此時(shí) Pi 的顏色為 I(x b 1 ), 我們記 δ b x = x b 1 − x0, δ I b j = I(x b 1 ) − I(x0). 類似像素初始在三角形外時(shí)的情形, 在 x0 和 x a 1 之間用 δ I a j δ a x , 在 x0 和 x b 1 之間用 δ I b j δ b x , 來近似 ∂Ij ∂vi . 由于 x0 為拐點(diǎn), 在 x0 的導(dǎo)數(shù)的定義需要特別定義. 為了讓梯度流更好地傳播, 在 x0 的導(dǎo)數(shù)如下定義:
其中 ∂Ij ∂xi a xi=x0 和 ∂Ij ∂xi b xi=x0 的定義和式 (1) 類似, 都是根據(jù)損失函數(shù)反向傳播的梯度信號 δ P j 來定義的, 分別判斷頂點(diǎn)向左和向右移動是否有利于損失函數(shù)降低. 如圖 5 第 6 行右半部分所示, 總共分為 4 種情況.
上面討論了對于單個(gè)三角形, 如何進(jìn)行光柵化以及對光柵化求導(dǎo). 對于多個(gè)三角形, 繪制的時(shí)候和傳統(tǒng)渲染管線一樣, 需要經(jīng)過測試與混合, 每個(gè)像素的顏色由深度最小的三角形決定 (這可以用 Zbuffer 算法實(shí)現(xiàn)). 在反向傳播梯度流時(shí), 我們需要計(jì)算某個(gè)像素對某個(gè)頂點(diǎn)位置的導(dǎo)數(shù), 該導(dǎo)數(shù)可能與和該頂點(diǎn)相鄰的所有三角形有關(guān), 對于每個(gè)和該頂點(diǎn)相鄰的所有三角形, 我們首先判斷頂點(diǎn)移動到臨界位置時(shí)像素是否會被遮擋 (可以利用存儲的深度信息來判斷), 如果像素總是被不包含該頂點(diǎn)的面遮擋, 也就是說無論如何移動該頂點(diǎn), 像素的顏色都不會變化, 說明該頂點(diǎn)無法影響該像素的顏色, 那么我們將它的梯度設(shè)為 0.
4.3 基于概率分布的光柵化
由于傳統(tǒng)的光柵化對頂點(diǎn)坐標(biāo)不可微 (導(dǎo)數(shù)幾乎處處為 0), 為了使得梯度流能夠反向傳播, 一種基于概率分布的光柵化方法 SoftRas[19] 被提出. 不同于前面介紹的兩種近似導(dǎo)數(shù)的方法, 該方法使用概率分布的方法改編了光柵化和測試與混合兩個(gè)步驟, 使得渲染的正向過程完全可微, 所以能夠求出精確的導(dǎo)數(shù).
SoftRas 的渲染管線如圖 6 所示. 它的輸入是頂點(diǎn)屬性 V , 光照參數(shù) L 和相機(jī)參數(shù) C. 頂點(diǎn)著色器對頂點(diǎn)坐標(biāo)進(jìn)行變換, 得到投影坐標(biāo) U 和投影深度 Z, 并根據(jù)光照參數(shù)逐頂點(diǎn)計(jì)算顏色 A, 我們?nèi)菀椎玫剿鼈兊奈⒎? 梯度流可以反向傳播. SoftRas 利用投影坐標(biāo)計(jì)算每個(gè)三角形在圖片上的概率分布 D 代替?zhèn)鹘y(tǒng)的光柵化過程, 之后使用投影深度將這些分布疊加代替?zhèn)鹘y(tǒng)的測試與混合過程, 最終得到渲染結(jié)果 f. 下面分別介紹如何計(jì)算每個(gè)三角形在圖片上的概率分布, 以及如何疊加不同三角形的概率分布.
對于某個(gè)三角形 tj , 我們估計(jì)它在圖片上的概率分布 Dj , 對于某個(gè)像素 pi , 我們定義 tj 在 pi 上的概率為 D i j = sigmoid ( δ i j d 2 (pi , tj ) σ ) , (3) 其中 σ 用于表示概率分布的銳利程度, 它的不同取值產(chǎn)生的效果如圖 7 所示, δ i j 為符號函數(shù), 若 pi 在 tj 內(nèi)則為 +1, 否則為 −1; d(pi , tj ) 表示 pi 到 tj 的距離, 它可以采用不同的度量, 一個(gè)常用的選擇是歐式距離. 我們不僅計(jì)算每個(gè)像素的概率分布, 還計(jì)算它的重心坐標(biāo), 對于三角形內(nèi)的像素, 重心坐標(biāo)正常定義, 對于三角形外的像素, 重心坐標(biāo)截取到 [0, 1] 的范圍內(nèi). 如圖 7 所示, RGB 值表示重心坐標(biāo). 我們用重心坐標(biāo)插值頂點(diǎn)顏色得到三角形在像素上的顏色 C i j .
當(dāng)?shù)玫搅怂腥切卧趫D片上的概率分布之后, 我們將它們按概率疊加, 這個(gè)過程需要用到深度信息. 離屏幕越近的三角形我們希望它的權(quán)重越高 (特別地, 對于傳統(tǒng)渲染使用的 Z-buffer 算法, 只有最近的三角形權(quán)重為 1, 其他三角形權(quán)重都為 0). 對每個(gè)像素 pi 求出每個(gè)三角形 tj 的權(quán)重 w i j :
其中 z i j 為三角形 tj 在像素 pi 的歸一化深度, ? 為表示環(huán)境光的參數(shù), γ 為表示疊加銳利程度的參數(shù), 它的不同取值產(chǎn)生的效果如圖 8 所示. 我們可以按如下公式計(jì)算像素顏色: I(pi) = w i bCb + ∑ j w i jC i j , (6) 其中 Cb 為環(huán)境光顏色. 可以看到像素顏色的計(jì)算過程完全可微, 梯度流可以傳播回輸入.
4.4 其他的方法
前面幾節(jié)詳細(xì)介紹了 3 種主流的可微渲染方法, 本小節(jié)將簡要介紹幾種其他的可微渲染方法. TF Mesh Renderer[9] 和傳統(tǒng)的渲染相同, 使用重心坐標(biāo)插值頂點(diǎn)屬性來計(jì)算像素的顏色. 它記錄每個(gè)像素最近的三角形, 使用重心坐標(biāo)來計(jì)算導(dǎo)數(shù), 在三角形內(nèi)的像素正常計(jì)算, 對于三角形外的像素, 使用負(fù)的重心坐標(biāo). 這種方法相當(dāng)于把物體局部看作平的, 是對遮擋邊界的導(dǎo)數(shù)的一種近似. 實(shí)踐上, 對于具有光滑的遮擋邊界且數(shù)目較少的情況處理較好, 難以處理遮擋邊界復(fù)雜, 互相遮擋的情況.
DIB-R [46] 對前景和背景分開處理. 對于被至少一個(gè)三角形覆蓋到的像素稱為前景, 對于沒有被三角形覆蓋到的像素稱為背景. 對于前景, 它采用和 TF Mesh Renderer[9] 類似的方法, 渲染時(shí)和傳統(tǒng)的渲染相同, 求導(dǎo)時(shí)使用最靠近的三角形的重心坐標(biāo). 對于背景, 它改編了渲染的方法, 和 SoftRas [19] 類似, 它用概率分布近似三角形對三角形外的影響, 影響大小和像素到三角形的距離相關(guān), 通過這些影響進(jìn)行計(jì)算得到背景像素的 Alpha 值. 對于前景像素, 它將梯度傳播回所在三角形的頂點(diǎn); 對于背景像素, 它會將梯度傳播回每一個(gè)頂點(diǎn).
DEODR [45] 在遮擋邊界上使用重畫不連續(xù)邊技術(shù) (discontinuity-edge-overdraw) [52] , 把渲染改編成可微的形式. 它是一種可微的抗鋸齒的方法, 通過沿著遮擋邊界線性混合前面的三角形和后面的三角形, 使得當(dāng)頂點(diǎn)運(yùn)動時(shí)渲染結(jié)果連續(xù)變化. 它的整個(gè)渲染過程是可微的, 并且可以處理遮擋邊界的變化對損失函數(shù)的影響, 也就是說損失函數(shù)的梯度流可以精確地傳播回輸入.
Versatile Scene Model [47] 提出了一種光滑的場景表示, 得到了一種可微的渲染方法, 它和傳統(tǒng)的渲染完全不同, 有些類似于 SoftRas. 它把物體表示成一系列各向同性高斯 (Gauss) 分布, 每個(gè)高斯分布有各自的反射率, 并針對這種表示提出了特別的渲染模型和渲染方法. 這樣場景函數(shù)是解析的, 渲染的過程可以看作光滑函數(shù), 渲染的結(jié)果是較為模糊的圖片.
4.5 不同方法之間的對比
首先, 本小節(jié)介紹的可微渲染方法均基于局部光照模型, 使用的方法大致分為兩類, 一類是求得近似導(dǎo)數(shù)用于反向傳播 [9, 18, 32] , 另一類改編了傳統(tǒng)渲染管線中的步驟, 使得像素對頂點(diǎn)可導(dǎo) [19, 45∼47] .
從上述可微渲染方法的渲染結(jié)果來看, 使用近似導(dǎo)數(shù)的方法 [9, 18, 32] 的渲染結(jié)果和傳統(tǒng)渲染方法的結(jié)果相同, 但近似中使用的方法不能支持所有的渲染方式, 比如文獻(xiàn) [18] 只能支持逐頂點(diǎn)計(jì)算屬性和顏色. 對于改編了渲染步驟的方法, 渲染結(jié)果一般會和傳統(tǒng)渲染不同. DIB-R [46] 的渲染結(jié)果在前景上和傳統(tǒng)渲染結(jié)果相同, 在背景上顏色和傳統(tǒng)渲染相同, 但會有一定的透明度; DEODR [45] 的渲染結(jié)果在內(nèi)部和傳統(tǒng)渲染相同, 但在遮擋邊界上會更加光滑; SoftRas [19] 的渲染結(jié)果會把不同三角形的顏色混合在一起, 帶有一定的透明度和混合效果, 它的透明度和混合效果可以根據(jù)參數(shù)來調(diào)整, 當(dāng)參數(shù)較大時(shí), 它和傳統(tǒng)渲染有明顯差異, 當(dāng)參數(shù)較小時(shí), 它接近傳統(tǒng)渲染的結(jié)果; Versatile Scene Model [47] 的渲染結(jié)果會比較模糊, 就像對圖片做了一次高斯模糊. 我們在圖 9 中展示了 3 種方法 [19, 32, 45] 的渲染結(jié)果供讀者參考.
可微渲染的最終目的, 不同于傳統(tǒng)渲染, 不是盡可能渲染出逼真的圖片, 也不是為了求出盡可能精確的導(dǎo)數(shù), 而是為了作為一個(gè)工具, 使得頂層應(yīng)用 (一般是一個(gè)優(yōu)化問題) 優(yōu)化得更好 (渲染出逼真的結(jié)果以及求出精確的導(dǎo)數(shù), 往往有助于優(yōu)化問題). 具體表現(xiàn)為損失函數(shù)的梯度流能夠傳播回輸入, 指導(dǎo)整個(gè)優(yōu)化過程. 所以衡量可微渲染方法的重要指標(biāo)就是, 梯度流是否能夠很好地傳播回輸入, 是否能夠正確地引導(dǎo)輸入朝著損失函數(shù)更低的方向改變. 這個(gè)問題需要結(jié)合應(yīng)用具體分析, 不同的應(yīng)用有不同的需求, 實(shí)踐的時(shí)候可以參考成功的案例, 詳見第 7 節(jié). 這里我們一般化地分析一下不同方法梯度流的行為. 首先對于近似導(dǎo)數(shù)的方法 [9, 18, 32] 和某些改編了傳統(tǒng)渲染的方法 [45, 46] , 它們的梯度只能傳播到最近的三角形, 不能傳播到被遮擋的三角形; 并且由于只考慮了深度之間的遮擋關(guān)系, 沒有考慮深度的大小與尺度, 所以只能在 xOy 平面上優(yōu)化坐標(biāo), 它們的梯度也不能傳播到深度信息來優(yōu)化深度 z. SoftRas[19] 使用深度信息來混合不同深度的三角形, 所以梯度可以傳播到被遮擋的三角形, 也可以優(yōu)化深度; Versatile Scene Model [47] 使用高斯模型來表示場景, 光線會隨著深度衰減, 所以可以優(yōu)化深度. 對于 xOy 平面上的坐標(biāo), 對于優(yōu)化幾何的應(yīng)用 (或是同時(shí)優(yōu)化幾何、材質(zhì)和其他參數(shù)的應(yīng)用), 這是我們最關(guān)心的部分, 也是不同方法之間區(qū)別的體現(xiàn). 不同方法的感知范圍不同, 文獻(xiàn) [18] 使用局部來近似梯度, 所以感知范圍很小; 文獻(xiàn) [32] 使用光滑臨界點(diǎn)之間的范圍來近似梯度, 文獻(xiàn) [45] 使用了重畫不連續(xù)邊技術(shù), 所以感知范圍會更大; 文獻(xiàn) [9] 對遮擋邊界做了平坦的近似, 雖然感知范圍很大, 但無法很好反應(yīng)遮擋邊界; 文獻(xiàn) [19, 46, 47] 使用概率分布來表示場景或渲染背景, 可以感知到整張圖片, 也能處理遮擋邊界. 對于具體梯度流在 xOy 平面上如何傳播, 圖 10 展示了不同方法下像素對頂點(diǎn)的梯度. 對于顏色和相機(jī)參數(shù), 由于不同方法用它們計(jì)算的方法類似, 所以梯度流的行為也較為相似, 并且梯度流的行為也和渲染方法相關(guān).
5 基于全局光照模型的可微渲染
本節(jié)介紹基于全局光照模型的可微渲染. 傳統(tǒng)的 OpenGL 渲染管線及根據(jù)其改編的可微渲染使用的是局部光照模型, 而全局光照模型和局部光照模型有很大區(qū)別, 相較于局部光照模型更加復(fù)雜但能渲染出更具有真實(shí)感的結(jié)果. 路徑跟蹤算法[53] 是基于全局光照的可微渲染方法[48, 49, 54] 的基礎(chǔ). 其基于蒙特卡洛 (Monte Carlo) 方法采樣并跟蹤進(jìn)入眼睛的光線, 對于從眼睛出發(fā)的每一根光線, 在場景中遇到每一個(gè)物體, 根據(jù)物體的材質(zhì), 按概率得到一個(gè)方向進(jìn)行反射或折射, 直到遇到光源, 超出場景范圍或達(dá)到最大迭代次數(shù). 也就是按概率分布采樣光線所有可能的路徑, 最后根據(jù)貢獻(xiàn)進(jìn)行積分, 這種渲染方法是一個(gè)無偏的全局光照渲染模型, 可以得到極具真實(shí)感的渲染結(jié)果. 下面介紹 3 種基于路徑跟蹤的全局光照可微渲染方法: 基于邊采樣的蒙特卡洛路徑跟蹤方法 [48]、重參數(shù)化不連續(xù)的被積函數(shù)方法 [49] 和路徑空間的可微渲染 [54] .
5.1 基于邊采樣的蒙特卡洛路徑跟蹤
基于邊采樣的蒙特卡洛路徑跟蹤方法[48] 可以分為兩個(gè)階段來理解, 第 1 階段只考慮首要可見性, 在屏幕空間采樣, 類似于局部光照模型, 第 2 階段把該方法擴(kuò)展到次要可見性, 可以處理陰影和全局光照, 這個(gè)階段需要考慮不同的視角, 在三維空間采樣, 還需要借助精妙設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)來處理更復(fù)雜的情況, 但主要思想類似.
在第 1 階段主要考慮屏幕空間, 且只考慮像素對水平方向和垂直方向的偏導(dǎo)數(shù), 對其他參數(shù)的偏導(dǎo)數(shù)可以通過鏈?zhǔn)椒▌t和一些天然可微的部分求出. 我們寫出路徑跟蹤算法計(jì)算某個(gè)像素值 I 的公式: I = ∫∫ f(x, y; Φ)dxdy, (7)
其中 Φ 為場景中需要優(yōu)化的參數(shù), f(x, y; Φ) 為場景函數(shù). 由于上述積分一般沒有閉形式解, 一般采用蒙特卡洛法來估計(jì)積分的結(jié)果. 我們的目的是求出像素 I 對場景參數(shù) Φ 的導(dǎo)數(shù), 但場景函數(shù) f 不一定對場景參數(shù) Φ 可導(dǎo), 所以我們無法通過蒙特卡洛法進(jìn)行采樣來直接計(jì)算導(dǎo)數(shù). 這是傳統(tǒng)的按面積采樣方法導(dǎo)致的, 在三角形的邊上可能會產(chǎn)生不連續(xù)的結(jié)果, 比如像素顏色不隨著頂點(diǎn)位置連續(xù)變化, 而是在某個(gè)臨界位置發(fā)生突變, 這和局部光照模型有類似的結(jié)論. 該方法的核心思想就是在不連續(xù)的邊上進(jìn)行采樣來計(jì)算積分, 對于某條邊 (在屏幕空間) 我們用 αi(x, y) 來表示這條邊所在的直線, 它把平面分成兩個(gè)半平面, 我們借助階躍函數(shù) θ 重寫式 (7):
這里按照三角形的邊把場景函數(shù) f 劃分成若干個(gè)子場景函數(shù) fi . 對上式求微分有 ∇ ∫∫ θ(αi(x, y))fi(x, y)dxdy = ∫∫ δ(αi(x, y))∇αi(x, y)fi(x, y)dxdy + ∫∫ θ(αi(x, y))∇fi(x, y)dxdy, (9) 其中 δ 為沖激函數(shù). 該梯度分為兩部分, 每個(gè)部分可以分別使用蒙特卡洛采樣來估計(jì). 第 1 部分包含沖激函數(shù), 只在三角形的邊上非零, 是積分中不連續(xù)的部分, 使用邊采樣來估計(jì); 第 2 部分和渲染過程完全相同, 只是把場景函數(shù)換成了它的梯度, 是積分中連續(xù)的部分, 使用傳統(tǒng)的面積采樣來估計(jì). 下面詳細(xì)介紹如何對上述第 1 部分進(jìn)行估計(jì).
由于式 (9) 的第 1 部分包含沖激函數(shù), 我們首先用沖激函數(shù)的性質(zhì)把它改寫成不包含沖激函數(shù)的形式, 考慮到只在三角形的邊上非零, 我們重新參數(shù)化并把它改寫成線積分: ∫∫ δ(αi(x, y))∇αi(x, y)fi(x, y)dxdy = 1 li ∫ b a ∇αi(x, y)fi(x, y)ds, (10) 其中 li 為邊的長度, s 為這條邊的弧長參數(shù), [a, b] 為這條邊在像素范圍內(nèi)的部分, 0 6 a 6 s 6 b 6 li . 該積分是在三角形邊上積分, 所以不再使用傳統(tǒng)的面積采樣, 而是使用邊采樣.
5.2 重參數(shù)化不連續(xù)的被積函數(shù)
一般化的路徑跟蹤的積分如下所示: I = ∫ X f(x; Φ)dx, (11) 其中 X 為積分的域, 一般為單位球面. 它在可見性發(fā)生變化時(shí)會變得不連續(xù), 并且不連續(xù)的位置并非固定不變的, 它和場景參數(shù) Φ 有關(guān). 一種重參數(shù)化不連續(xù)的被積函數(shù)方法 [49] 被提出, 它通過重新參數(shù)化路徑跟蹤的積分, 使得不連續(xù)的位置和場景參數(shù)無關(guān) (并非完全消除不連續(xù)性). 其核心思想是在 Φ 的鄰域 U(Φ) 內(nèi)找到一個(gè)參數(shù)變換 T : Y × U(Φ) → X 來重新計(jì)算積分: ∫ X f(x; Φ)dx = ∫ Y f(T(y, Φ); Φ)|detJT |dy, (12) 其中 JT 為 T 的雅可比 (Jacobi) 矩陣. 為了不影響渲染的正向計(jì)算, 參數(shù)變換被要求在當(dāng)前場景參數(shù) Φ 下為恒等變換. 參數(shù)變換也相當(dāng)于一種新的采樣過程, 該方法通過參數(shù)變換, 使得采樣過程中不連續(xù)的位置不隨場景參數(shù)變化而變化.
下面我們介紹如何得到這個(gè)參數(shù)變換, 下面的討論假設(shè)積分的域 X 為單位球面 S 2 . 對于某些場景只需要在非常小的角度內(nèi)積分, 比如點(diǎn)光源加上很小的立體角, 這個(gè)時(shí)候積分中不連續(xù)的地方集中在物體的輪廓上, 此時(shí)可以用球面的旋轉(zhuǎn)來近似參數(shù)對不連續(xù)物體輪廓的擾動, 將這個(gè)擾動也作用到采樣過程上, 從而抵消擾動的影響. 在這種情況下, 假設(shè)存在一個(gè)旋轉(zhuǎn) R(ω, Φ) 使得 f(R(ω, Φ); Φ) 在 ω 取任何值下都與 Φ 連續(xù), 此時(shí)雅可比矩陣的行列式的絕對值為 1. 計(jì)算這個(gè)旋轉(zhuǎn)不需要知道這個(gè)積分包含了哪些輪廓, 只需要知道場景參數(shù)在微小擾動下輪廓上點(diǎn)的變化量, 實(shí)現(xiàn)上使用幾束光線來采樣這個(gè)變化量. 對于需要在更大角度內(nèi)積分的場景, 需要更復(fù)雜的參數(shù)變換才能抵消參數(shù)的影響, 這個(gè)復(fù)雜的參數(shù)變換可以通過首先對場景進(jìn)行一次卷積, 在卷積之后再進(jìn)行旋轉(zhuǎn)得到. 考慮到一個(gè)事實(shí), 下述積分等于進(jìn)行卷積之后積分: ∫ S2 f(ω)dω = ∫ S2 ∫ S2 f(µ)k(µ, ω)dµdω, (13) 其中 k 是一個(gè)球面上的卷積核, 對任何 ω 滿足 ∫ S2 k(µ, ω)dµ = 1, (14) 這個(gè)卷積操作不會改變渲染的結(jié)果, 但會影響計(jì)算導(dǎo)數(shù)的過程. 原論文中使用 κ = 1000 的 von MisesFisher 分布作為卷積核.
5.3 路徑空間的可微渲染
在路徑空間對路徑積分進(jìn)行微分的方法 [54] 的核心思想是推導(dǎo)出微分路徑積分公式, 使用這個(gè)積分公式設(shè)計(jì)出一種蒙特卡洛法來無偏地估計(jì)像素值 (或輻照度) 對任意場景參數(shù)的微分. 由于該方法的推導(dǎo)過于復(fù)雜, 本小節(jié)只介紹核心方法和核心結(jié)論.
記場景為 M(π), π 為場景參數(shù), 一條從光源到眼睛的路徑表示為 x¯ = (x0, x1, . . . , xN ), 其中 N > 1, xi ∈ M(π), 路徑空間為 ? = ∪∞ N=1?N , ?N = M(π) N+1 . 路徑積分可以表示為 I = ∑∞ N=1 ∫ ?N f(¯x)dµ(¯x), (15) 其中 dµ(¯x) = ∏N n=0 dA(xn) 為估計(jì)的路徑密度, 它是表面面積 dA(xn) 的乘積, f(¯x) 是這條光線路徑的能量, 它是每個(gè)點(diǎn) xn 的雙向散射分布 (bidirectional scattering distribution function, BSDF) 在路徑中的對應(yīng)入射角出射角的值 g(xn+1; xn, xn−1) 的乘積再乘上權(quán)重.
路徑積分 I 對場景參數(shù) π 求微分, 結(jié)果分為內(nèi)部和邊界兩項(xiàng), 這個(gè)微分原文中有兩種形式, 一種是空間形式 (spatial form), 另一種是客觀形式 (material form). 由于原文中的蒙特卡洛法使用的是客觀形式, 我們這里寫出客觀形式. 我們首先簡要介紹參考布局 (reference configuration), 它是一個(gè)抽象的二維流形 B, 某個(gè)特定的參數(shù) π 存在一個(gè)從 B 到 M(π) 的雙射, 可以理解為抽象的參數(shù)空間. 客觀形式是在參考布局上計(jì)算微分: ∂I ∂π = ∫ ?ˆ ( ˆf) ′ (¯p)dµ(¯p) + ∫ ∂?ˆ ? ˆfK(¯p)V?BK (pK)dµ ′ (¯p), (16) 其中第 1 項(xiàng)是內(nèi)部項(xiàng), 第 2 項(xiàng)是邊界項(xiàng), ?ˆ 是和參數(shù) π 無關(guān)的在參考布局上的客觀路徑空間, ∂?ˆ 是其中至少有一個(gè)頂點(diǎn)在邊界上 (進(jìn)行微小擾動產(chǎn)生的變化不連續(xù)) 的路徑, ˆf 是在客觀路徑空間上定義的對光線路徑能量的計(jì)算函數(shù), 可以由 f 重新參數(shù)化后得到, 對應(yīng)地其中的 BSDF g 重新參數(shù)化為 gˆ, V 是和 π 無關(guān)的標(biāo)量法向速度 (scalar normal velocity), ?BK 由一系列 gˆ 對參數(shù) pK 不連續(xù)的邊界曲線組成
下面介紹對內(nèi)部項(xiàng)和邊界項(xiàng)的估計(jì)算法. 由于內(nèi)部項(xiàng)的形式和路徑積分相似, 對內(nèi)部項(xiàng)的估計(jì)可以在計(jì)算路徑積分時(shí)同時(shí)求出, 算法流程和路徑跟蹤算法相同, 論文中采用單向路徑跟蹤算法. 單向路徑跟蹤的算法是一個(gè)采樣過程, 每次在參考布局中采樣一條路徑, 通過跟蹤路徑計(jì)算這條路徑的能量. 對于邊界項(xiàng)的估計(jì), 論文中給出了一種新的基于蒙特卡洛法的無偏估計(jì)算法: 多向路徑采樣算法 (multi-directional sampling). 由于邊界點(diǎn)是路徑中間的某一段導(dǎo)致的, 如何采樣這樣的邊界路徑是這個(gè)問題最大的挑戰(zhàn), 單向的路徑跟蹤需要每一步都變換視角來尋找邊界點(diǎn), 為了回避這個(gè)困難, 這個(gè)算法的核心思想是: 根據(jù)邊界點(diǎn)把路徑分成兩部分, 前一段是連接光源的子路徑, 后一段是連接視點(diǎn)的子路徑, 在采樣的過程中, 先在場景曲面上采樣一個(gè)點(diǎn)和一個(gè)方向, 過這一點(diǎn)作這個(gè)方向的直線, 向兩端延伸得到兩個(gè)頂點(diǎn), 將這兩個(gè)頂點(diǎn)加入路徑, 采樣點(diǎn)本身不屬于這條路徑, 然后從這兩個(gè)頂點(diǎn)出發(fā)采樣兩個(gè)子路徑, 這樣采樣得到的路徑為邊界路徑. 計(jì)算邊界項(xiàng)的過程依然是路徑跟蹤框架, 其中采樣的過程使用多向路徑采樣算法, 被積函數(shù)可以由參考布局上的路徑計(jì)算得到.
5.4 比較和分析
上述 3 種方法 [48, 49, 54] 分別提出了一種不同于傳統(tǒng)路徑跟蹤的采樣過程. 邊采樣的方法把路徑積分中不連續(xù)的部分剝離出來, 在不連續(xù)的邊上進(jìn)行采樣來計(jì)算積分的不連續(xù)部分, 在連續(xù)的部分使用傳統(tǒng)的面積采樣; 重參數(shù)化的方法通過對積分進(jìn)行參數(shù)變換, 使得采樣過程中不連續(xù)的位置不隨場景參數(shù)變化而變化; 路徑空間的可微渲染把路徑積分的微分拆成內(nèi)部項(xiàng)和邊界項(xiàng)兩項(xiàng), 分別在路徑空間使用蒙特卡洛法進(jìn)行估計(jì). 其中邊采樣的方法具有完全可微的正向過程, 所以它的導(dǎo)數(shù)是完全精確的, 但它對場景有一定的限制和假設(shè), 比如不包含點(diǎn)光源; 重參數(shù)化的方法求得的是近似導(dǎo)數(shù), 并且對某些場景并不能很好地支持, 求得的導(dǎo)數(shù)有很大的誤差; 路徑空間的可微渲染不改變路徑跟蹤的算法, 并且微分的過程也是路徑跟蹤的框架, 在路徑空間求得路徑積分的微分的無偏估計(jì).
6 開源的可微渲染工具
已經(jīng)有許多開源的可微渲染工具, 比如 DEODR [45]1), SoftRas [19]2), OpenDR [18]3), DIRT [55]4) , PyTorch3D[56]5), Neural 3D Mesh Renderer[32]6), TF Mesh Renderer[9]7), Tensorflow Graphics[57]8), DIBR [46]9), Redner [48]10), Mitsuba2 [49]11) 等. 它們的特性如表 1 所示, 其中 DEODR, SoftRas, OpenDR, DIRT, Neural 3D Mesh Renderer, TF Mesh Renderer, Tensorflow Graphics, 和 DIB-R 使用的是局部光照模型, Redner 和 Mitsuba2 使用的是全局光照模型, 其渲染的結(jié)果更接近現(xiàn)實(shí)世界, 對輸入為現(xiàn)實(shí)世界的照片的應(yīng)用可能會有更好的效果, 但時(shí)間開銷會更大, 而且參數(shù)更多更難優(yōu)化. 其中 SoftRas, DIB-R, PyTorch3D 和 Neural 3D Mesh Renderer 基于深度學(xué)習(xí)框架 PyTorch; TF Mesh Renderer, DIRT 基于深度學(xué)習(xí)框架 Tensorflow; Tensorflow Graphics 是 Tensorflow 的圖形庫; DEODR 和 Redner 同時(shí)適用于深度學(xué)習(xí)框架 PyTorch 和 Tensorflow; OpenDR 是 Python 的包; Mitsuba2 是 C++ 的庫, 也有深度學(xué)習(xí)框架 PyTorch 的接口. 其中 DEODR, SoftRas 和 Redner 使用的方法具有完全可微的正向過程, 所以能求出精確的導(dǎo)數(shù); OpenDR, DIRT, Neural 3D Mesh Renderer 和 TF Mesh Renderer 使用不同的方法對導(dǎo)數(shù)進(jìn)行近似, 而不改變渲染的正向過程; TF Mesh Renderer 和 Tensorflow Graphics 無法很好地處理遮擋邊界的梯度, 有一定的局限性; Redner 和 Mitsuba2 使用的是全局光照模型, 能夠?qū)﹂g接光照求導(dǎo), 但由于需要對光線的分布進(jìn)行大量采樣, 計(jì)算花費(fèi)的時(shí)間也是巨大的, 不過 Redner 支持使用局部光照的模式來加速, 只考慮主要可見性, 在這個(gè)模式下依然具有完全可微的正向過程和精確的導(dǎo)數(shù).
紋理貼圖在渲染中很重要, 我們簡要地介紹不同的開源工具對紋理貼圖的支持. 其中 DEODR, SoftRas, OpenDR, Neural 3D Mesh Renderer, DIB-R, DIRT, Redner, Mitsuba2 支持帶紋理貼圖的可微渲染, TF Mesh Renderer, Tensorflow Graphics 不支持帶紋理貼圖的可微渲染, 其中 OpenDR 采用 Mipmap, Neural 3D Mesh Renderer 使用特殊的按重心坐標(biāo)訪問的紋理, 每個(gè)三角形的紋理是一個(gè)立方體.
7 可微渲染的應(yīng)用
可微渲染有著廣泛的應(yīng)用, 主要集中在逆渲染上, 包括幾何重建、材質(zhì)和紋理估計(jì)、相機(jī)參數(shù)估計(jì)和光照參數(shù)估計(jì)等. 如表 2 [5∼44, 58∼62] 所示, 我們把不同的工作按照使用的開源可微渲染工具、研究對象的類別和領(lǐng)域分類.
7.1 物體
從二維到三維的重建任務(wù)通常可以定義為, 希望根據(jù)輸入的一張或多張圖片推導(dǎo)得到場景中出現(xiàn)的物體的三維模型 (包括幾何、紋理和材質(zhì)) 以及物體的位置等信息, 即從渲染的輸出得到渲染的輸入. 對于渲染的每一類輸入, 都有專門的應(yīng)用模型.
7.1.1 幾何和位置優(yōu)化
幾何是指關(guān)于一個(gè)物體的形狀的信息, 一般表現(xiàn)為三角網(wǎng)格 (mesh), 對于具有先驗(yàn)信息的一類物體, 可能有參數(shù)表示的形式. 位置由物體在場景中的模型矩陣進(jìn)行表示, 包括平移、旋轉(zhuǎn)和放縮變換. 三維重建的一類重要的方法是合成分析 (analysis-by-synthesis), 即根據(jù)三維參數(shù)渲染得到二維圖片, 與真實(shí)圖片進(jìn)行對比, 從而不斷調(diào)整三維參數(shù)直到二者接近相同. 如果采用傳統(tǒng)的渲染方法, 為了訓(xùn)練網(wǎng)絡(luò)則需要大量的關(guān)于場景中物體的三維標(biāo)注或者多視角標(biāo)注, 而可微渲染可以做到將像素的導(dǎo)數(shù)反向傳播至三維模型的頂點(diǎn), 因此網(wǎng)絡(luò)可以接受單張圖片作為輸入, 直接利用更容易得到的二維標(biāo)注信息, 甚至讓弱監(jiān)督乃至無監(jiān)督訓(xùn)練成為可能.
為了根據(jù)合成圖片與真實(shí)圖片幾何的差異計(jì)算損失函數(shù), 最常使用的二維標(biāo)注是物體的掩膜 [33, 38∼40] , 也有模型在掩膜的基礎(chǔ)上計(jì)算語義關(guān)鍵點(diǎn)的距離 [38, 40] . 除了利用手工標(biāo)注的數(shù)據(jù)集之外, 由于計(jì)算機(jī)視覺在一些特定任務(wù)下對于處理圖片存在一些成熟的模型, 也有一些工作選擇利用目前最高水平的既有模型自動標(biāo)注, 進(jìn)一步降低了數(shù)據(jù)集構(gòu)造的成本, 例如文獻(xiàn) [33] 利用現(xiàn)有的語義分割的模型對輸入圖片處理得到掩膜和包圍盒. 除此之外, 還有模型利用了現(xiàn)有的真實(shí)感渲染器, 在合成圖片的數(shù)據(jù)集上訓(xùn)練, 因此可以直接保留包括掩膜、語義關(guān)鍵點(diǎn)、位置、材質(zhì)等渲染參數(shù)作為標(biāo)注[40] . 計(jì)算兩張圖像之間像素級的距離是最直接的設(shè)計(jì)損失函數(shù)的方式, 例如掩膜[33, 38∼40]、像素的強(qiáng)度[12] . 然而如果僅僅直接利用像素?cái)?shù)據(jù), 可能導(dǎo)致對小的幾何瑕疵敏感, 導(dǎo)致重建圖片模糊. 為此一些模型引入感知損失, 即將合成圖片與真實(shí)圖片輸入訓(xùn)練后的神經(jīng)網(wǎng)絡(luò)模型, 在多個(gè)隱層的特征圖上定義距離 [12, 39, 40] .
7.1.2 紋理和材質(zhì)優(yōu)化
在渲染管線中, 著色器會利用物體表面材質(zhì)、光照、視角等信息, 計(jì)算待渲染物體表面像素的顏色. 一種常用的著色方式是使用紋理貼圖 (texture mapping). 根據(jù)用途不同, 紋理貼圖可分為法向貼圖、漫反射貼圖、粗糙度貼圖、高光貼圖等, 其包含了物體表面的材質(zhì)信息. 傳統(tǒng)的紋理材質(zhì)建模需要采集大量不同光照、視角下目標(biāo)物體的圖片, 以進(jìn)行數(shù)據(jù)驅(qū)動的重建. 而近年來, 基于深度學(xué)習(xí)的重建方法使得僅從少量甚至單張圖片估計(jì)物體的紋理材質(zhì)信息成為可能. 其中, 可微渲染器的使用保證了此類方法的可行性.
紋理材質(zhì)重建通常是三維模型重建問題的一部分, 為了獲取真實(shí)的紋理材質(zhì)信息, 研究者們提出了大量的方法. 一類方法 [38, 40, 43] 基于紋理流. Kanazawa 等 [38] 提出了一種從單張圖片重建特定類別的物體的三維模型的方法, 在紋理重建部分, 其采用了預(yù)測紋理流的方法, 即預(yù)測從輸入圖像上采樣的坐標(biāo)值, 然后通過采樣和雙線性插值生成紋理貼圖, 克服了直接回歸像素值產(chǎn)生的紋理貼圖較為模糊的缺點(diǎn). Li 等 [43] 對文獻(xiàn) [38] 的方法提出了兩點(diǎn)的改進(jìn). 其提出了 EM 式的漸進(jìn)訓(xùn)練方法, 迭代地提升預(yù)測紋理流的準(zhǔn)確度; 同時(shí)提出了一種基于投影閉環(huán)的紋理一致性誤差, 解決了紋理流預(yù)測中具有相近顏色的面的紋理從同一個(gè)像素采樣的問題. Zuffi 等 [40] 與文獻(xiàn) [38] 有類似的思路, 但在回歸網(wǎng)絡(luò)給出預(yù)測結(jié)果后, 還增加了優(yōu)化步驟. 另一類方法則從建立高質(zhì)量的紋理模型入手. 文獻(xiàn) [10, 17] 在解決人臉重建的問題時(shí), 將紋理生成對抗網(wǎng)絡(luò)引入到重建網(wǎng)絡(luò)中替代三維可變形模型 (3D morphable model, 3DMM) 的紋理模型, 使得重建的紋理細(xì)節(jié)豐富, 具有較高的保真度.
7.2 人體相關(guān)
相比于普遍意義下的物體, 與人相關(guān)的重建問題受到人們格外的關(guān)注, 理解人在圖片或視頻中幾何與位置的三維信息在自動駕駛、機(jī)器人、虛擬現(xiàn)實(shí)等大方向中有重要的應(yīng)用價(jià)值. 專注于人的重建問題的模型與其他模型有著相同的基本思路, 與此同時(shí)人也有一系列特有的性質(zhì), 使得一些針對性的解法可以達(dá)到更佳效果, 這些性質(zhì)包括: 人作為整體以及各個(gè)部位基本形狀已知, 有多種成熟的參數(shù)模型; 除了多角度拍攝, 人可以自主做出動作, 重建模型的輸入可能是一段視頻序列; 人有定義在生理結(jié)構(gòu)上的關(guān)節(jié), 關(guān)節(jié)包含了重要的幾何信息. 與人相關(guān)的重建問題中最受關(guān)注的主要包括人臉、人體, 以及人手重建.
7.2.1 人臉
從二維圖像重建人臉的三維模型是近期計(jì)算機(jī)視覺和圖形學(xué)領(lǐng)域的研究熱點(diǎn)之一. 帶標(biāo)注的三維人臉數(shù)據(jù)的缺乏, 使得采用無監(jiān)督或弱監(jiān)督的方式訓(xùn)練三維重建網(wǎng)絡(luò)的方法受到了大量的關(guān)注. 其中, 部分工作 [9, 10, 13, 17] 在網(wǎng)絡(luò)中引入了諸如 3DMM [63] 的三維人臉模型來對三維人臉數(shù)據(jù)進(jìn)行表示, 部分工作 [12] 則不涉及現(xiàn)成模型.
圖 11 [64, 65] 展示了基于參數(shù)模型重建三維人臉模型的無監(jiān)督或弱監(jiān)督網(wǎng)絡(luò)的典型框架. 輸入圖像通過回歸網(wǎng)絡(luò)預(yù)測參數(shù), 由可微渲染器合成圖片, 再利用輸入圖像與輸出圖像計(jì)算損失, 從而更新回歸網(wǎng)絡(luò)的參數(shù). 在具體實(shí)現(xiàn)上, 每一部分可能有不同的實(shí)現(xiàn)方式, 也可能存在結(jié)構(gòu)和步驟的新增與替換.
文獻(xiàn) [9] 提出的方法采用編碼器 – 解碼器結(jié)構(gòu), 利用合成圖像和無標(biāo)注的二維真實(shí)圖像進(jìn)行訓(xùn)練. 其使用了可微渲染器 [9] 來計(jì)算并反向傳播損失函數(shù), 損失函數(shù)包括像素?fù)p失、關(guān)鍵點(diǎn)損失、身份損失和內(nèi)容 (人臉識別網(wǎng)絡(luò)的隱藏層特征) 損失. 文獻(xiàn) [13] 提出了一種基于 CNN 的從二維人臉圖像重建精確的三維人臉模型的弱監(jiān)督方法. 其使用 3DMM 模型表示人臉, 采用 ResNet-50 [66] 來預(yù)測三維模型參數(shù)及成像參數(shù), 然后通過可微渲染器生成重建人臉的二維圖像. 該方法采用圖像和認(rèn)知兩個(gè)層面的損失函數(shù)以及 3DMM 系數(shù)的正則項(xiàng)指導(dǎo)網(wǎng)絡(luò)的訓(xùn)練, 其中, 圖像層面采用了結(jié)合注意力機(jī)制的像素誤差和人臉的關(guān)鍵點(diǎn)誤差, 認(rèn)知層面采用 FaceNet [67] 提取人臉特征計(jì)算誤差. 文獻(xiàn) [12] 提出了一種無監(jiān)督的不依賴現(xiàn)有模型重建具有對稱性的物體的方法. 其思想是從單張圖像分解出圖像的構(gòu)成信息, 即深度、反照率、視角與光照, 然后結(jié)合對稱性以及置信圖, 采用可微渲染器 [32] 重建二維圖像, 然后使用輸入圖像與生成圖像的重建誤差作為損失函數(shù).
可微渲染理論在為三維人臉重建的問題提供新的范式的同時(shí), 也促進(jìn)了無監(jiān)督或弱監(jiān)督的三維人臉重建網(wǎng)絡(luò)在相關(guān)領(lǐng)域的模塊化應(yīng)用. 文獻(xiàn) [11] 在提出的人臉視頻去模糊網(wǎng)絡(luò)中, 創(chuàng)新性地集成了使用可微渲染器的三維人臉重建網(wǎng)絡(luò)以提供人臉的先驗(yàn)信息. 通過借助重建網(wǎng)絡(luò)渲染的清晰人臉結(jié)構(gòu)和提取的人臉身份信息, 該方法克服了傳統(tǒng)方法定位面部結(jié)構(gòu)不準(zhǔn)確、結(jié)果不夠自然的缺點(diǎn), 能夠產(chǎn)生高質(zhì)量的去模糊視頻. 文獻(xiàn) [5] 使用可微渲染器的三維人臉重建網(wǎng)絡(luò)到替換身份的生成網(wǎng)絡(luò)中. 其借助重建網(wǎng)絡(luò)從輸入圖像重建三維人臉模型, 然后替換身份參數(shù)渲染具有不同身份信息的二維人臉圖像, 再經(jīng)過生成對抗網(wǎng)絡(luò)的修正, 生成身份信息已混淆的、具有較好細(xì)節(jié)和真實(shí)感的圖像, 達(dá)到保護(hù)隱私的目的.
7.2.2 人體
人體可以被視為一類形狀特定且位姿服從一定規(guī)律的物體, 在單目圖片作為輸入導(dǎo)致問題不適定的情況下, 利用人體相關(guān)的先驗(yàn)知識可以提升模型性能. 人體參數(shù)模型到面片模型的相互轉(zhuǎn)化過程可微, 可以參與重建管線的整體訓(xùn)練. 人體的關(guān)節(jié)是天然的語義關(guān)鍵點(diǎn), 通過關(guān)節(jié)往往就可以獲得足夠的信息重建人體幾何. 根據(jù)二維關(guān)節(jié)標(biāo)注, 以及預(yù)測的三維關(guān)節(jié)在二維上的投影, 我們可以計(jì)算它們的距離來設(shè)計(jì)損失函數(shù). 文獻(xiàn) [25] 在應(yīng)用可微渲染之后, 損失函數(shù)定義在有二維標(biāo)注的掩膜和關(guān)節(jié)上. 文獻(xiàn) [20] 在應(yīng)用可微渲染之后, 重建部分的損失函數(shù)僅定義在關(guān)節(jié)標(biāo)注上.
7.2.3 人手
人手重建問題對機(jī)器手控制、虛擬現(xiàn)實(shí)手勢識別等方向有著重要意義. 人手的手指與手掌構(gòu)成精巧的結(jié)構(gòu)、自遮擋、背景雜亂和與物體的互動等復(fù)雜場景給重建帶來多種困難. 目前缺乏有完整三維標(biāo)注的數(shù)據(jù)集, 可微渲染的出現(xiàn)提高了二維標(biāo)注信息的可用性, 一方面可以使用可微渲染搭建利用二維標(biāo)注的重建模型, 另一方面可以將可微渲染視為產(chǎn)生三維標(biāo)注的一步. 如果有模型可以從二維標(biāo)注信息恢復(fù)高質(zhì)量的三維信息, 就可以生成更多的標(biāo)注數(shù)據(jù). 即便模型結(jié)果的質(zhì)量不足以作為標(biāo)注投入使用, 也可以在交互的過程中降低成本.
8 可微渲染未來可能的發(fā)展方向
8.1 下一代可微渲染的方法
現(xiàn)有的可微渲染方法的研究和應(yīng)用主要集中在局部光照模型上, 因?yàn)榫植抗庹漳P蛯τ诤唵蔚膱鼍耙呀?jīng)十分有效. 全局光照模型計(jì)算開銷過大, 也會大大增加訓(xùn)練過程的時(shí)間花費(fèi). 對于局部光照模型的可微渲染, 它的定位應(yīng)當(dāng)是主要處理具有高度先驗(yàn)信息的簡單場景, 比如人臉或是人手, 除此以外還可以用來渲染某些屬性, 比如 PNCC 或是法向投影. 所以它的發(fā)展趨勢應(yīng)當(dāng)是: (1) 梯度流更精確且更具有指導(dǎo)意義; (2) 對渲染模型的假設(shè)和限制更少, 比如不再要求對顏色的計(jì)算是逐頂點(diǎn)的; (3) 對一些先進(jìn)的實(shí)時(shí)渲染技術(shù)進(jìn)行支持, 比如陰影和近似的全局光照; (4) 支持先進(jìn)的抗鋸齒技術(shù), 得到無鋸齒的合成圖片, 從而在物體邊界上有更精確的結(jié)果. 對于全局光照模型的可微渲染, 最迫切的需求是進(jìn)行加速, 比如減少對采樣的次數(shù)的需求, 或是對渲染質(zhì)量和渲染速度進(jìn)行折衷. 對于全局光照模型在逆渲染的應(yīng)用, 由于我們已經(jīng)有積分的結(jié)果, 也就是輸入的真實(shí)圖片, 所以基于全局光照的可微渲染方法不一定需要局限于路徑跟蹤的框架, 利用積分的結(jié)果來估計(jì)參數(shù)和導(dǎo)數(shù)可能存在更簡單的方法.
可微渲染的一大應(yīng)用是逆渲染, 對于逆渲染這個(gè)特別的應(yīng)用, 往往已經(jīng)具有真實(shí)的渲染結(jié)果了, 我們可能還有對渲染輸入的一個(gè)初始估計(jì). 但通常可微渲染方法都沒有考慮到我們已經(jīng)有這樣一個(gè)渲染結(jié)果了, 在渲染時(shí)只考慮了渲染的輸入, 因?yàn)榇蠖鄶?shù)可微渲染方法在設(shè)計(jì)時(shí)并不局限于逆渲染的應(yīng)用. 對于固定逆渲染應(yīng)用, 設(shè)計(jì)可微渲染方法的一個(gè)可能的嘗試是, 將這個(gè)真實(shí)的渲染結(jié)果利用上, 使渲染速度更快并讓渲染結(jié)果更好.
一個(gè)某些模塊可以自由編程的可微渲染平臺也是非常具有價(jià)值的, 這種平臺類似于 OpenGL 的可編程管線, 又類似于自動求導(dǎo)的工具. 因?yàn)楝F(xiàn)有的可微渲染工具, 大多步驟和模塊都是固定的, 這可能是由于現(xiàn)有的可微渲染方法對渲染模型的假設(shè)和限制過大. 所以當(dāng)一個(gè)足夠通用的可微渲染方法被提出, 這樣的可編程可微渲染平臺也會隨之出現(xiàn).
8.2 可微渲染的應(yīng)用
可微渲染已經(jīng)有豐富的應(yīng)用, 在第 7 節(jié)已經(jīng)進(jìn)行了詳細(xì)的介紹. 除了這些應(yīng)用之外, 可微渲染還有很大的潛力等待被發(fā)掘. 可微渲染應(yīng)用的發(fā)展不能離開可微渲染方法和理論的發(fā)展, 也促進(jìn)了可微渲染方法和理論的發(fā)展. 在我們之前提到的應(yīng)用中, 逆渲染 (包括重建幾何和位置、紋理和材質(zhì)、光照和相機(jī)等參數(shù)) 是最主要也是最自然的一類應(yīng)用; 除此之外使用可微渲染合成圖片 (包括語義分割和圖片合成) 則更進(jìn)了一步, 它利用可微渲染的正向過程來生成結(jié)果; 使用可微渲染生成對抗樣本則跨度更大, 解決了看似不相關(guān)的問題. 許多毫不相關(guān)的問題實(shí)際上可以通過某種精妙設(shè)計(jì)的方法聯(lián)系起來, 而可微渲染本身就是圖形學(xué)和計(jì)算機(jī)視覺之間的橋梁, 也是三維模型和二維圖片之間的橋梁, 它更可能被用于各種意想不到的應(yīng)用, 比如可能用作分析數(shù)據(jù)分布和結(jié)構(gòu)的工具. 除此以外, 利用可微渲染制作生成數(shù)據(jù)或是帶標(biāo)注的數(shù)據(jù)集是一件有意義的事情.
對于現(xiàn)有的應(yīng)用, 依然有許多未解決的問題. 對于從單張照片進(jìn)行重建的應(yīng)用, 由于信息的缺失, 一方面只能恢復(fù)部分的三維模型; 另一方面, 如何完全解耦光照相機(jī)等全局參數(shù)和形狀紋理參數(shù)依然是一個(gè)大問題, 比如人臉重建領(lǐng)域, 在弱透視投影下無法解耦位姿參數(shù)和表情參數(shù) [68] . 現(xiàn)有的許多方法都是借助可微渲染來訓(xùn)練一個(gè)深度神經(jīng)網(wǎng)絡(luò)的, 通過神經(jīng)網(wǎng)絡(luò)預(yù)測出參數(shù), 但神經(jīng)網(wǎng)絡(luò)的穩(wěn)定性、魯棒性和可解釋性都有待提高. 對于不同視角的照片或是對照片進(jìn)行微小旋轉(zhuǎn), 預(yù)測的結(jié)果變化很大. 對于視頻應(yīng)用, 許多預(yù)測的結(jié)果不夠光滑從而產(chǎn)生大量抖動, 或是不同幀的結(jié)果差異較大. 可微渲染本身具有穩(wěn)定性、魯棒性和可解釋性, 今后可能借助可微渲染來設(shè)計(jì)通用具有穩(wěn)定性、魯棒性和可解釋性的神經(jīng)網(wǎng)絡(luò)或是其他方法.
8.3 分析數(shù)據(jù)的工具
對于解析的可微的渲染方法, 我們可以利用它來分析數(shù)據(jù)分布的結(jié)構(gòu), 比如數(shù)據(jù)的概率分布和流形結(jié)構(gòu). 許多機(jī)器學(xué)習(xí)的方法對數(shù)據(jù)都有一定的假設(shè), 比如概率分布的假設(shè)或是流形結(jié)構(gòu)的假設(shè), 但這些假設(shè)很難驗(yàn)證, 也很難去確認(rèn)它的結(jié)構(gòu). 一方面是因?yàn)榈玫降臄?shù)據(jù)只是數(shù)據(jù)真實(shí)分布的一些采樣點(diǎn), 對于維度非常高的數(shù)據(jù)空間, 很難用少量采樣點(diǎn)來描述. 生成的數(shù)據(jù)能夠很好地幫助我們解決這個(gè)問題, 比如對于圖片相關(guān)的工作, 利用傳統(tǒng)渲染方法生成數(shù)據(jù)能夠有效地幫助我們解決許多問題, 但還不足以幫助我們完全了解數(shù)據(jù)的真實(shí)分布和結(jié)構(gòu). 我們可以把傳統(tǒng)的渲染方法當(dāng)作黑盒的數(shù)據(jù)采樣器, 解析的可微渲染方法就是白盒的數(shù)據(jù)采樣器. 想要完全了解數(shù)據(jù)的真實(shí)分布, 黑盒的數(shù)據(jù)采樣器還不足夠, 因?yàn)閿?shù)據(jù)分布和結(jié)構(gòu)可能很復(fù)雜. 使用可微渲染器生成對抗樣本 [41, 42] 可能已經(jīng)是這個(gè)方向的萌芽. 假設(shè)數(shù)據(jù)具有流形結(jié)構(gòu), 了解數(shù)據(jù)的內(nèi)在維度, 是了解數(shù)據(jù)的一種方法. 對于生成一類數(shù)據(jù), 可能有很多輸入?yún)?shù), 但相比于數(shù)據(jù)的內(nèi)在維度可能要多很多, 因?yàn)樵S多參數(shù)之間互相耦合并不獨(dú)立. 如果我們有一個(gè)完全解析的渲染過程, 我們可以借助這個(gè)渲染過程來分析數(shù)據(jù)的內(nèi)在維度. 當(dāng)我們對數(shù)據(jù)的分布和結(jié)構(gòu)有一定的理解之后, 一方面能幫助我們設(shè)計(jì)更好的模型來解決實(shí)際問題, 另一方面也能幫我們解釋某些黑盒模型.
9 總結(jié)
本文首先介紹了傳統(tǒng)渲染管線, 以 OpenGL 的可編程渲染管線為例, 介紹了傳統(tǒng)渲染管線中每個(gè)步驟的任務(wù). 隨后逐步引入可微渲染的主要思想、基本原理和方法, 對它們進(jìn)行介紹、分析和比較. 其中詳細(xì)介紹了 3 種主流的可微渲染方法和幾種其他的可微渲染方法, 大致可以分為兩類, 一類是求得近似導(dǎo)數(shù)用于反向傳播, 另一類是改編了傳統(tǒng)渲染管線中的步驟, 讓像素對頂點(diǎn)可導(dǎo). 本文介紹了 3 種基于路徑跟蹤的可微渲染, 一種是基于邊采樣的蒙特卡洛路徑跟蹤的方法, 一種是重參數(shù)化不連續(xù)的被積函數(shù)的方法, 另一種是路徑空間的可微渲染方法. 本文隨后列出了一些開源的可微渲染工具, 并整理了它們的特性, 供讀者參考并進(jìn)行比較. 本文介紹了可微渲染的廣泛應(yīng)用, 分為人臉、人體、人手和物體 4 個(gè)方面. 本文在最后列舉了一些可微渲染可能的發(fā)展方向以及對未來進(jìn)行展望. 希望本綜述能幫助讀者快速理解可微渲染的思想, 找到最適合的可微渲染方法以及開源工具.
論文指導(dǎo) >
SCI期刊推薦 >
論文常見問題 >
SCI常見問題 >