當前位置:首頁 >教程首頁 > Maya >怎樣做到又快又好?樹木的逼真渲染

怎樣做到又快又好?樹木的逼真渲染

發布時間:2018-11-17 19:57:24
渲染樹木可以說是非常困難的一件事,因為樹幹和樹葉有著不一樣的著色需求,它們各自還需要連接到合適的動畫和交互之上。


早期用於生成這種幾何圖形的工具是Paint Effects,因為它能夠非常成功地做出自然的素材,特別是當多邊形在RMS的真實著色器中轉換和著色的時候。雖然Paint Effects擁有一定的優勢,但是要成功製作樹木還是會有一些困難。原來我是打算使用新的GP Paint Effects著色器的,但是Paint Effects本身還存在一些缺陷,比如說它不能處理UV,所以我決定將畫麵中的多邊形都轉換成Paint Effects。我做出這個決定時,首先擔心的是畫麵的複雜度,大型的多葉樹木可能會有大量的多邊形,尤其是可以看到所有樹木的場景。這時候就需要用到Alembic緩存和RenderMan RibArchives。

對於這個項目來說,非常重要的一點是同步動畫和原始Paint Effects節點之間的變動,所以在生成樹木的過程需要采用非破壞性的方法。你首先會注意到的是一個被命名為“oakTree_LeavesUV”的隱藏節點,這是“oakTree_Leaves”的副本。該副本是用於將UV轉移到原始的“oakTree_Leaves”節點的,因為Paint Effects會嚐試生成每一幀的UV,這樣實際上會重置每一幀樹葉上的UV,但是我們需要每一幀的UV保持一致。

我也將橡樹分成了3個獨立的對象,這樣可以盡可能高效地處理它們,這三部分分別是樹葉、枝幹和樹幹。我將樹幹和枝幹獨立出來是因為大部分的枝幹都會被樹葉遮蓋,因此對於我們的鏡頭來說,不使用材質貼圖來著色枝幹也是可以接受的。樹幹成為了獨立的幾何圖形之後,我們要處理的多邊形數量就降低了,意味著我們可以高效地進行造型和繪圖,而且文件大小也可以變得很小。


RMS的其中一個優勢是它能夠很好的處理PTEX文件。這些文件可以為不帶UV的模型添加材質。通常來說材質填充器會在2D畫布上填充像素,但是PTEX文件可以在3D畫布上填充Texel,因此模型本身就不再需要(UV)2D表示。有幾個繪圖和造型軟件都可以很好地兼容PTEX,包括Mari和Mudbox。

為了實現合適的Mudbox工作流,我們在導入和導出時需要考慮某些屬性的問題。還有一點很重要的是,素材在最終完成之後的拓撲結構不能更改,因為PTEX會對每個表麵分配一個ID,所以如果更改拓撲結構的話,分配到的ID就會出錯。
 
Mudbox的PTEX設置

我們首先要做的是先了解PTEX的工作流和向量置換(vector displacement)。為了提取準確的貼圖,我們需要確保導入的基礎網格在整個繪圖和造型過程當中不會受到影響,所以就需要在一個副本網格中完成所有的操作。在一個新的圖層中進行造型也是很好的做法,這樣就可以避免影響到原來的幾何圖形。

為了準備好導入的幾何圖形,我們需要進入“Mesh”>“PTEX Setup”,然後你會看到下圖所示的窗口。這個窗口可以對你的幾何圖形應用Texel分辨率,這個選項可以在調整的過程中隨時改變。對於樹木,我選擇的是4百萬Texel,相當於2K的材質。Texel的數量越多,文件的大小就越大。這是我們需要記住的一點,因為PTEX文件會比傳統的光柵圖像大得多。


Mudbox的PTEX向量置換

為了確保可以準確導出向量置換,請將原始模型設置成“Target Model”,並將副本網格(帶有全部細節)設置成“Source Model”。這樣做可以確保你會將VD貼圖分配到Maya中沒有改動過的幾何圖形。請不要選擇“Smooth Target UVs”,因為你在細分和準備原始幾何圖形的時候已經完成這項操作了。


請不要改動Texel的“Density”,因為這樣做會覆蓋掉模型原來的Texel分辨率。最好是將“Use PTEX Setup”選擇為“Texel Distribution”,這樣就可以禁用前麵的兩個屬性。你還需要確保將“Object”選擇為“Vector Space”,這是PTEX文件唯一可以用於不含UV的幾何圖形的方法。通常我們在“Data Format”設置中都需要選擇一種浮點圖像格式,這樣做是為了有足夠的數值來保存細節。

你在導出文件之後就可以在“ptxview”中查看它,你會在裏麵看到帶有3D幾何圖形信息的PTEX文件。


GP著色器向量置換

GP著色器擁有針對向量置換的內置設置。我們首先要做的是將“Displacement Mode”設置成“Mudbox Vector (Obj)”,這樣可以將PTEX貼圖分配到模型的局部坐標空間中。這個向量空間對於不含UV和變形的幾何圖形來說很有用。樹幹部分能夠完美的適應這兩種類型。“Displacement Scale”應該保持在“1.0”,除非你需要做出一些明確的改動。它能夠對應Mudbox的準確置換量。正如我們在Car Chapter中所看到的,PTEX貼圖必須連接到“Vector Displacement”屬性的主輸入中,如果你嚐試將它連接到每個通道的話是不行的。

一般的Maya文件節點都能很好地適用於PTEX文件,不過請確保添加一個RenderMan材質屬性,用於過濾和gamma控製。


PTEX Support

另外一個非常重要的屬性是PTEX Support,它是添加在幾何圖形形狀節點上的,具體位置“Attributes”>“RenderMan”>“PTEX Support”,如果沒有這個設置的話,渲染器不能渲染PTEX文件。請保持這些屬性為默認狀態,除非你明確需要補償PTEX參數。


請通過使用SGA麵板分配PTEX Support屬性到多個形狀節點上,這樣可以幫助你追蹤多個對象的嵌套屬性。

置換屬性(Displacement Attributes)

另外一個重要的屬性是對象的Displacement Bound。RenderMan裏麵所有的對象都有一個相關的邊界框(bounding box),它能夠高效地將對象讀取到內存當中。為了保留這種高效性,Displacement Bound屬性會向渲染器指示表麵邊界框的擴展程度,這樣的話它就能包圍表麵的置換點。通常來說,你可以將Displacement Bound設置成“Displacement Scale”乘以“Float Displacement”(或者“Vector Displacement”)的結果,然後如果你看到任何的置換警告或者畫麵假象的話,可以適當增加Displacement Bound。如果設置值太高的話就會占用大量的內存,所以要盡可能地取一個準確的值。GP著色器有一個用於Displacement Bound的自動估值器,不過我認為手動設置這個值會更安全一些,特別當你的置換貼圖較大的時候。

這些單元代表的是標準的Maya單元,而且會隨對象的大小改變,所以在沒有鎖定變形的情況下,請謹慎調整對象的大小,因為你有可能會得到置換量和不正確的Displacement Bound。請點此了解更多相關信息。

一個非常重要的屬性是將光線追蹤設置為“Trace Displacements”。在默認狀態下,RenderMan不會對置換進行光線追蹤,這是為了避免計算每個有置換貼圖產生的細節的反射和陰影。雖然這種做法在深層陰影工作流中可以快速做出優秀的結果,但是會在對陰影進行光線追蹤時會在負置換值上增加許多不必要的假象。

如果將Trace Displacements設置成“None”,置換就會被忽略,這樣可能會造成不必要的陰影和反射假象,因為光線沒有考慮到置換,所以隻會追蹤原始的形狀。如果將該屬性設成“All”,光線會追蹤置換貼圖生成的每個多邊形,這樣的話成本就會很高,但這是最準確的方法。另外一個有趣的選項是將Trace Displacements設成“FIne”,這樣的話光線就會隻追蹤光源或者光線變窄的位置。


著色器的網絡非常簡單,它獨特之處在於帶有Maya 3D Brownian材質的高光分散(specular breakup)。它可以在光線照到的樹幹邊緣添加一些微光。不用害怕空白的材質預覽和樣本,這是Maya對PTEX和某縣光柵化文件的限製。即使著色器看起來沒有經過編譯,但是它渲染起來不會有問題。請使用腳本編輯器重複檢查可能的錯誤。


樹葉

對於渲染器來說,渲染樹木是一項成本高昂的工作。樹葉需要有透明度(transparency)和半透明度(translucency),所以如果我們沒有準確理解GP著色器的話,對成千上萬的樹葉進行光線追蹤會消耗大量的時間。

我們的視覺發展需要的是秋季的大樹,上麵長滿各種顏色的樹葉,這樣就可以柔和的背景產生良好的對比。這種樹葉會造成一些技術方麵的挑戰,包括樹葉變化和恰當的半透明著色。為了做出樹葉變化,我利用djPTFXUVs這個來自David Johnson的優秀腳本,將它們的UV隨機分成4個UV殼。我也能夠通過使用primvas隨機化每片葉子的材質查找來實現這點,不過這樣做可能會給葉子生成數千個節點,然後會讓Maya(更不要提RIB生成了)的速度變得非常慢。


SideMask

我們的樹葉著色器使用了一個叫做SideMask的節點,來自RMS4。這個節點可以使用表麵的前後法線,你可能會問為什麼不使用帶有Maya節點的翻轉法線(flipped normal)呢?其實原因很簡單,RenderMan Pro Server 17改變了表麵定位的方法,它使用全新的光線追蹤遮蔽器來準確定義背麵剔除。你可以點此了解相關信息。

為了做出每片樹葉應有的細節,我在葉子的兩麵使用了不同的材質。我也添加了一個multiplyDivide節點,加倍材質的數值,不過隻是針對般透明度,所以能夠毫無障礙接收光線的樹葉會比其他樹葉更加明亮。


透明度

開始時我嚐試了一些折中的方案,希望加快渲染的速度,比如說不使用透明度。我覺得深色的陰影會是一個很好的折中方案,但在經過一些測試之後,我決定采用一個更加細致和真實的方法,就是使用半透明度來做出透明的樹葉。這種做法會犧牲一些渲染時間,你們可以在下麵的例子看到這點,但是樹葉看起來會變得自然得多,特別是在動畫當中。


透明度隻有在oakTree_Leaf_Shader當中的Computes Opacity設置準確的時候才能正確使用。為了做出準確的陰影,我們需要選擇“Compute”(用於透明表麵)或者“View Dependent”(用於類玻璃表麵)。對於樹木我選擇的是“Compute”,因為對於如此大量的樹葉來說,選擇“View dependent”的成本太高了,而且它也不會帶來額外的好處。後者最適合與GP Glass著色器結合使用,利用Shadow Darkness屬性來模擬玻璃和彩色的陰影。


在開始進行透明度計算之前,請先研究樹葉的類型。

某些幹燥和厚重的樹葉的透明度較低,所以它們不需要進行透明度計算。
 
半透明度

GP Shader的Translucency屬性在模擬燈光吸收時可以起到很大的幫助,它的成本要比SSS低得多,而且能夠做出很好的超薄幾何圖形,如果采用次表麵散射的話,計算量會非常浩大。不過要記住的一點是Translucency隻在啟用Transparency和Computes Opacity設置成“Calculate”的情況下有效,不然的話你不會看到任何的效果,除了一些奇怪的噪點之外。還有一點要注意的是半透明度隻在現有的表麵上可見,你不會在表麵的前方看到這種效果。

我們使用的是著色樹葉的韋恩圖,我們使用分層材質在顏色貼圖上疊加這個韋恩圖。這樣就可以更加真實地實現半透明的效果。


RibArchive工作流

我們在RMS18中最有趣的功能之一是全新的RibArchive工作流,尤其是當它結合到Alembic緩存的時候。使用RibArchive的好處有很多,因為它能夠將大量的數據(比如說我們的樹木)轉換成單個.zip格式的RIB文檔,這個文檔能夠作為單個邊界框來讀取,因此能夠在Maya上釋放大量的內存,減少所需的計算量,並大幅提升RenderMan的速度,因為它不需要在表麵上進行ribgen操作。例如,你可以想象場景裏麵有1000棵樹木,每棵樹都有幾千個節點,但你可以預覽1000個表示樹木的邊界框,這樣就不會導致Maya崩潰。接下來我們再想象同一個場景,但是邊界框換成了Alembic緩存,這樣你就可以看到帶有動畫的完整樹木!Alembic緩存和RibArchive結合起來可以達到很強大的功能。

除了能夠帶來視窗和ribgen的大量加速之外,你在製作流程方麵得到很多好處。你可以對原始素材進行重新著色,而且RibArchive可以理解重新編譯的著色器,並一下子將其應用到整個製作流程!RibArchive也能夠很好地適用於Dynamic Binding係統,你可以在這個係統中重新著色一個RibArchive,甚至完全不會影響到原來的著色器。我們會在以後的章節中進一步探討這方麵的內容。如果想了解深入的解釋,請觀看RibArchive docs。

GPU Alembic緩存

針對我們的橡樹,我使用了結合RIbArchive的GPU Alembic緩存。為了實現這點,我們需要確保選中主要的oakTree組,並進入Animation > Pipeline Cache > GPU Cache > Export Selection選項框。確保“Optimization Threshold”有較高的取值,這樣我們就可以預覽樹木大部分的細節,大概40000個頂點就有很好的效果了。請保留其他所有屬性為默認值,這樣我們就可以估計每一幀的動畫。一個比較方便的工作流是將Alembic Cache和RibArchive命名為準確對應的名字(區分大小寫)。


GPU Alembic緩存會存放在顯存當中,它的大小會比係統內存更低。

有時候使用傳統的Alembic緩存來保存GPU資源會更好。
 
RibArchive

現在我們的橡樹可以被轉換成一個RibArchive。要做到這點,我們需要選中主要的oakTree組,然後使用RenderMan > Rib Archives > Create Node and Write Archives選項框。我們需要確保選中“Start/End”,這樣就可以保存帶有動畫的RibArchive。很重要的一點是要記得啟用“Render Globals”中的“Motion Blur”,這樣會稍微降低ribgen的速度,但是我們可以靈活地啟用和禁用最終場景的Motion Blur。

RMS完成ribgen之後,它會在$PROJ/renderman/ribarchives路徑中保存文檔,這是所有RibArchive保存的位置。著色器也會以同樣的文件結構保存,你在保存RibArchive時產生的GPU緩存也會保存在同一位置。這樣的話文件之間的傳輸會方便得多。RibArchive會限製於$PROJ/renderman/ribarchives/objectRibArchiveShape/shaders路徑下的著色器,不過你可以在該文件夾覆蓋任何的新著色器,不會影響到RibArchive。

Alembic+RibArchive

想要整合新生成的素材,我們可以采用如下的幾個工作流:第一個是將GPU Alembic Cache導入到一個新場景中,並在選中Alembic節點的同時生成一個RibArchive節點。這樣可以生成一個自動帶有同一命名的GPU緩存節點的RibArchive節點。(我之前說過將兩個節點命名為同一個名字會很方便!)在默認狀態下,RibArchive會通過Content屬性的“Siblings”與Alembic緩存交換數據,因此可以在渲染期間使用RibArchive覆蓋Alembic文件。


第二個的步驟跟前麵的一樣,但是這次沒有使用“Siblings”,而需要使用Content屬性中的“Exisiting RIB Archive”。這樣可以確保RibArchive不會跟父文件交換數據。不過這種方法的缺點是需要將Archive放到它們各自的分組,並手動從RibArchive中分離Alembic Cache。這時我們明顯需要隱藏Alembic的節點(或者將它們變成模板)來避免渲染它們。


第三種工作流是在編寫RibArchive的時候勾選Export GPU Cache。這樣可以同時做出RibArchive和GPU緩存,並自動將它們整合到Maya場景中。值得注意的一點是,新生成的GPU緩存不會保存到標準的Maya位置中,而是在上麵所說的RenderMan文件夾結構中。請確保時刻跟蹤這種情況,避免出現重複的文件。

 
回顧

使用PTEX文件來發揮幾何圖形的優勢,不然的話它的UV會需要過多的處理時間。

確保使用正確的向量編碼,謹記不要在分配好PTEX文件之後對拓撲結構進行改動。

RenderMan的其中一個優勢是它處理置換速度。請盡可能地多使用置換,避免場景中出現過多的幾何圖形。

確保在著色器中使用“SideMask”節點,準確使用表麵定位。

透明度和半透明度可以增加真實感,不過需要增加渲染時間。

結合使用RibArchive和Alembic Cache,提升視窗性能和製作流程的靈活性。
 
华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答

微信掃碼入群領福利

掃碼領福利最新AI資訊

點擊谘詢
添加老師微信,馬上領取免費課程資源

1. 打開微信掃一掃,掃描左側二維碼

2. 添加老師微信,馬上領取免費課程資源

×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定