頂點著色允許烘焙復雜的紋理和渲染樹信息為頂點顏色屬性。與Render Map相似,但頂點著色是將表面的信息烘焙為頂點顏色(Color At Vertice,簡稱CAV) 的屬性。因此,結果的質量大部分取決于多邊形的密度。
頂點著色在游戲開發(fā)方面很有用,因為它允許你將基本的紋理信息和光照信息直接烘焙進場景物體。這樣就可以刪掉一些燈來減少計算量和整體場景的大小。
這種方法不倚賴于圖片或者最終聚集,在某些方面優(yōu)勝于傳統(tǒng)的方法,但也存在一些局限性,就是設置繁瑣。
在這里,我們使用一個簡單的場景。這個場景只有一個大盒子(Box),盒子內是一輛沒輪子的小車(小車多邊形的密度比較大,墻腳多邊形的密度相對小,大家可以注意兩者的效果)。盒子的內壁已被指定了頂點顏色(名為lanlan_wall),但沒有燈光和材質。我們將在盒子內頂部放置一個大的Light_Box。
首先,要為場景準確設置傳統(tǒng)的光。每一個光源必須有一個反向的方形衰減,因此必須將它們的陰影本影設置為黑色,這就意味著場景物體的表面所反射的光要比它們接收的少。如果使用Phong,要確信Specular不會太亮,Ambient被設置為黑色。
然后,我們就使用Render Map(烘焙成CAV)把渲染樹的信息烘焙成一個頂點顏色屬性(CAVs)。
CAV表示原始光的第1次光反彈(bounce),并用于后來的渲染。此外,它還將用于在下一步驟中加速計算下一次光反彈。當這個光反彈不再重復影響原始光(直接光照),就使用另一個CAV表示原始光的第2次光反彈(bounce),然后添加到第1次反彈(以及添加到原始光)來增加場景的真實性。
創(chuàng)建燈光和材質

1.因為場景沒有燈光和材質,所以要先創(chuàng)建這些要素。
在Explorer中刪除默認的燈光。然后從Render工具欄中選取Get > Light > Light Box命令,創(chuàng)建一個Light Box,將它放置到盒子的內頂部上,設置它的大小為頂部的1/4左右。并且在打開的屬性編輯器中設置相關的屬性。如右圖所示。

2.為物體指定一個phong材質。按7鍵打開Box物體的Render Tree,獲取一個Map Lookups > Vertex RGBA節(jié)點,并將它連接到Phong材質的diffuse節(jié)點。雙擊Vertex RGBA節(jié)點打開它的屬性編輯器,將Vertex PRoperty設置為lanlan_wall(內壁的顏色屬性),如右圖所示。

3. 雙擊Phong節(jié)點,打開Phong屬性編輯器,將Diffuse Ambient的RGB設置為黑色;將Specular Color的RGB都設置為0.05;將Specular Decay設置為23。如右圖所示。
創(chuàng)建lightmap
如果沒有使用大的區(qū)域光(Area Light),第4和5步驟可以省略。但在這個場景中,我們使用了一個大的區(qū)域光,因為它能加速第一個光反彈(bounce)的計算。這樣就可以從區(qū)域光烘焙直接光照(dirct illumination)為一個新的CAV。

4.為Box物體創(chuàng)建一個RenderMap屬性(選擇Box物體,然后選取Render > Get > Property > Render Map命令)。如左圖所示。
5.在打開的RenderMap屬性編輯器中,將Basic頁面中的Sampling設置為vertices only(RenderVertex);在Resulting CAV區(qū)域中單擊New按鈕,創(chuàng)建一個新的Color At Vertices(簡稱CAV),然后單擊Edit按鈕重命名為lanlan_light;勾選Disable區(qū)域中的Refraction和Reflection項以及Sampling區(qū)域中的Average colors around vertices項。

鎖定RenderMap屬性編輯器,使它處于活動狀態(tài),以便于下次使用。如右圖所示。

6.單擊Regenerate Map…按鈕重建Render Map(這樣就將渲染樹的信息烘焙成lanlan_light)。
在Material屬性編輯器中預覽,它看起來與步驟3的渲染圖像一樣。如左圖所示。
創(chuàng)建第1次光反彈(bounce)

7.在Render Map屬性編輯器,創(chuàng)建一個新的CAV,并且命名為lanlan_bounce1;取消勾選Disable區(qū)域中的Reflections項。如右圖所示。
8.在Render Tree視圖中,從Nodes菜單獲取Reflection_diffuse和Ray_type節(jié)點,將前者連接到后者的eye上,將Vertex RGBA節(jié)點連接到Ray type的reflection上,然后再將Ray type節(jié)點連接到Material的Surface上。

在Vertex_rgba屬性編輯器中,將Vertex Property設置為lanlan_light。在Reflection_diffuse屬性編輯器中,將Reflection的RGB都設置為1,設置Gloss為1,設置Samples為12。如右圖所示。
注意:
通常,光澤反射會分配到被反射的eye light的采樣點上,渲染它們而不用于GI計算。當使用Render Map,被反射的eye light就會指向表面法線的同一個方向,這是GI采樣點的來源地。
Render Map會將光澤反射物體作為反射物體,因此通過Ray_type節(jié)點將一個標準的表面shader附加到reflections,將光澤反射shader附加到eye上。

9.在RenderMap屬性編輯器中,單擊Regenerate Map…按鈕重建lanlan_bounce1。如右圖所示。
注意:
RM/reflection diffuse shader有個bug,就是當多邊形面與坐標平面正對齊的時候,會顯示為黑色。所以在這里我們要稍微旋轉一下Box物體(0.1,0.1,0.1),使多邊形不再平行于正交平面(XY,YZ,XZ)。
創(chuàng)建第2次bounce
創(chuàng)建好第1次 bounce后,接著為直接光創(chuàng)建第2次bounce。這是來自第1次bounce的光。直接光照(lanlan_light)不被列入計算范圍,因為它已經被反彈過了。在最終渲染中就不用重復渲染它了。
10.在RenderMap屬性編輯器,創(chuàng)建一個新的CAV,并且命名為lanlan_bounce2。

11.在Render Tree視圖中,從Nodes菜單中獲取兩個Vertex_RGBA節(jié)點(Map Lookup節(jié)點),分別命名為wallcolors和bounce。連接節(jié)點后,在wallcolors節(jié)點的屬性編輯器中,將Vertex Property設置為lanlan_wall;在bounce的屬性編輯器中,將Vertex Property設置為lanlan_bounce1;在Mix_2colors節(jié)點的屬性編輯器中,將Weight color的RGB都設置為1,并且設置Mode為Hide/Reveal(Multiply)。如右圖所示。

12.重建lanlan_bounce2。在Material屬性編輯器中預覽,它看起來有點黑。如右圖所示。
創(chuàng)建更多的光反彈(bounce)
要產生一個真實的效果,最好創(chuàng)建一個總數大約為6-8次的bounce。在這里,因為bounce能很快地變黑,所以4個就足夠了。否則,材質容易會出錯。
13.打開Render Map屬性編輯器,創(chuàng)建一個新的CAV,并且命名為lanlan_bounce3。

14.將渲染樹的wallcolors節(jié)點的Vertex Property設置為上次產生的bounce (也就是lanlan_bounce2),然后重建lanlan_bounce3,它看起來會更黑。如左圖所示。

15.重復13和14步驟,創(chuàng)建lanlan_bounce4,并重建它。如右圖所示。
創(chuàng)建總光照的CAV
16.在Render Map屬性編輯器中,創(chuàng)建一個新的CAV,并且命名為lanlan_total。

17.在Render Tree視圖中,從Nodes菜單中獲取4個Vertex RGBA節(jié)點(Map Lookup節(jié)點)和一個Mix_8colors節(jié)點。將這4個節(jié)點(在此重命名為bounce1、bounce2…)分別連接到Mix_8colors節(jié)點的color1、color2…,然后在它們各自的屬性編輯器中,將Vertex Property分別設置為lanlan_bounce1、lanlan_bounce2,以此類推 。如左圖所示。

18.在Mix節(jié)點的屬性編輯器中,將Base Color的RGB都設置為0。將Layer1、Layer2、Layer3和Layer4設置為In Use,將這4層的Weight RGB都設置為1,將Mode設置為Add。如右圖所示。

19.重建total,在Material屬性面板中預覽,效果如下圖所示。如左圖所示。
最終渲染

20.在Render Tree視圖中,從Nodes菜單中獲取兩個Vertex RGBA節(jié)點(Map Lookup節(jié)點),分別將它們命名為lanlan_color和bouncetotal。在lanlan_color的屬性編輯器中,將Vertex Property設置為lanlan_wall;在bouncetotal的屬性編輯器中,將Vertex Property設置為total;在Mix_2colors屬性編輯器中,將Mode設置為Hide/Reveal(Mutiply),設置Weight的RGB都為1;在Mix_2colors1屬性編輯器中,將Mode設置為add,設置weight的RGB都為1;Phong節(jié)點的設置與步驟一相同。如右圖所示。

21.最終的渲染效果如下圖所示。大家可以看到,小車的效果比盒子的效果要好,那是因為小車的多邊形密度比盒子的大。如左右圖所示。

新聞熱點
疑難解答
圖片精選