經常有人問我你最近在干什么,但一句話真的很難說明白,最近兩個月一直在嘗試將Skin Microstructure Deformation with Displacement Map Convolution這篇論文以離線渲染的形式搬運到現有三維工具中,優先就是maya。首先非常感謝論文發表團隊無私的貢獻了自己的研究成果及過程,附一個論文introduce:http://gl.ict.usc.edu/Research/SkinStretch/。
概述:在cg制作中臉部寫實渲染一直是體現水准的領域,隨着硬件、掃描技術及渲染器的進步,臉部寫實的靜幀渲染已經趨向完美,但臉部動作導致的皮膚微觀結構拉伸擠壓效果的模擬依然存在瑕疵,因為微觀結構往往是由掃描貼圖置換surface獲得,而這個掃描貼圖往往是單幀,靜態的貼圖只會跟着臉部頂點做縮放變換,並不能產生動態的拉伸擠壓效果。Skin Microstructure Deformation with Displacement Map Convolution這篇論文就高效的解決了這個問題。但論文中采用的是實時的方案,這種方案雖然效率高,執行快,但對於vfx公司來講,能夠生成動態貼圖序列並輸出才是最佳方案。我解決的就是這個問題。
以下簡要記錄一下我的實現過程。
一:使用maya變形器的過程中一般會有原始shape及變形shape兩個模型,首先要做的是提取任一shape的頂點信息,再迭代獲取頂點相連的三角面列表,將單一三角面信息存儲為向量信息,再將該三角面向量翻轉到TangentSpace,這樣就可以在uv空間中計算原始shape到變形shape的transform矩陣了,平均該頂點相連的三角面列表的transform矩陣即可獲得當前頂點的transform信息。
二:利用頂點transform信息,即可計算拉伸軸s、t及拉伸量了。旋轉矩陣的計算及拉伸軸的計算都可以通過svd分解獲得,2x3矩陣及2x2矩陣的svd分解都可以不借助計算庫完成,所以整個過程會很干凈。
三:獲得所有頂點的s、t軸及拉伸量后,即可將着手前片元處理了。在這里我並未利用opengl來繪制stmap圖,而是自行寫了一個片元方法來解決插值步驟,大致思路是對模型中所有三角面遍歷,翻轉三角面到uv空間中,沿y軸進行掃描,逐行計算st軸及拉伸量。此處略。
四:現在已經有了st片元信息,就可以開始后片元操作了。利用前片元信息,對原始置換貼圖做兩次卷積,即可獲得動態貼圖。實際上這一步是一個近似計算,因為此處只是近似的將二維卷積算子分解為兩個一維算子,但考慮算法復雜度的大幅優化,這種近似是可以接受的。
這四步就是我的基本實現步驟,完成這個研發項目的過程波折不斷,既要冒着項目失敗的風險,也要頂住其他因素的干擾。在最后時刻驚險完成工具原型的同時,也離開了公司。
放幾張成果圖吧:
冒險是件很有意思的事,但就到這里吧。