【如何用十塊錢買房】Unity室內場景 + 光照練習 I

十塊錢買房?在Unity裡面搭個場景就好了呀。

也不知道是從什麼時候起,圈內就流行一種說法,說Unity適合做手機遊戲,Unreal適合做大作。多年從事Unity游(jiao)戲(ge)開(zuo)發(y的我,真想替Unity報個不平。以絕大多數遊戲團隊的努力程度,還沒到要拼引擎的地步!!!對熟練的開發者來說,用Unity做次時代畫面的遊戲也不是什麼難事。

所以今天就從最簡單的室內場景入手,扒一扒Unity的渲染機制吧。

(Unity版本 5.6.1f1)

模型導入

模型來自於asset store上的一個資源,鏈接如下

Asset Store

當然,這種傢具模型資源網上是出奇的多,免費資源很容易找到,這裡就不詳細介紹了。

這裡需要說一下模型導入的選項。在Project窗口裡面點選模型文件(*.obj,*.fbx),就會在Inspector裡面出現如下信息:

Scale Factor 影響的是導入場景後物體的比例,比如原來一個物體Scale Factor是1,導入場景後Transform里的Scale是(1,1,1),要是這裡調成10,導入場景的物體就會變大10倍,但是其scale的數值不變,仍為(1,1,1)。

File Scale 有時候會發現有些.fbx文件會莫名其妙的特別小,因為.fbx默認的scale為0.01,而.obj,.ma這種默認的是1。在前幾個版本裡面這個scale是改不了的,需要在Maya導出模型文件的時候注意一下設置。這個版本可以選擇把File Scale去掉,算是給程序員一個貼心的設計吧。

Mesh Compression 是對存儲數據的位數進行壓縮,並不是網格簡化。

Read/Write Enabled 關閉了以後就不能通過代碼修改模型的節點位置信息了。Unity的Mesh.triangles之類的介面是會有可能會出現,在運行時把工程里的模型覆蓋掉的情況的。這大概就是針對這點進行一個的保護措施。

BlendShape 可以用作簡單的插值動畫。建議程序員學一學,用來做一些隨機性的簡單動畫(像場景中的花花草草這種)特別好用。

Generate Collider 用於Mesh Collider

Keep Quads 對於需要用到Dx11 Tessellation技術的一些模型可能需要勾選。下面有一個關於Tessellation技術的介紹:

DirectX 11 Tessellation

或者直接看看asset store裡面的shader(免費)

Asset Store

感覺Bump Mapping和Smooth都是比較牛逼,可惜只有DirectX支持(Mac黨233333)

Generate Lightmap UVs 很關鍵的一點,Generate Lightmap UVs一定要勾上(當然如果有美工姐姐給做好了的可以不勾)。只有這個選項勾上之後,烘焙的光才有作用。

嗯嗯,大概點了和沒點的差別如下:

Normal 就是法線,法線的計算方法就是三個點確定一個面,一個面再取正向的法線。分享一篇說法線的文章

A better method to recalculate normals in Unity - The Scheming Developer

Tangent 這裡涉及一個切線空間的概念,好像知乎上已經有大神對這個做了總結了,在這裡放個鏈接:

為什麼要有切線空間(Tangent Space),它的作用是什麼?

Tangent 選項涉及到bump map相關的效果,下面兩張圖片上圖是沒有計算切線空間的,下圖是有計算切線空間的,可以明顯看到上圖在邊緣處光照強度以及紋理分布不合理。

擺放模型

按照個人喜好來布置房間里的傢具,我做的如下:

導入材質

給模型貼上材質。這裡需要對應的材質的貼圖。比如沙發的材質是這樣的:

Unity 的新版本更新了材質系統,算是跟目前主流的PBR(Physically Based Rendering,既物理渲染)渲染技術接軌了。因為如此,可以看到材質上出現了的Metallic和Smoothness這樣的係數。

主流的PBR技術使用的一個很重要的物理學光照模型(數學模型)叫做BRDF,全名叫Bidirectional Reflective Distribution Funtion,正是應為這個函數的出現使得物理渲染有了重大的突破。

對於BRDF的公式有很多不同的版本,流傳比較好的應該是這個版本:

圖形學的基本概念就是,不考慮透明物體的情況下,對於屏幕中的每一個像素點,從屏幕發射一個射線到場景中,對於射到的第一個物體上的交點,進行一系列亂七八糟的數學計算,最後得到的顏色值顯示在屏幕上。當屏幕上所有的像素點都計算完之後,自然就會得到一個關於該場景的渲染圖。而上面這個公式就是這一系列亂七八糟的數學計算中的一個很重要的部分。

等式左邊為光線強度,也可以粗略的等同為反射光的顏色。其中v為視角方向向量,l為光線方向向量,N為法線向量,h叫做中途向量,就是下面這個東西:n

有圖應該更好理解:

其中的函數:

F(v,h) :Fresnel equation 菲涅爾效應,不知道大家還記不記得這個出現在中學物理裡面的名詞。生活中的例子是從不同角度看水看到的圖像是不同的,垂直著水面能看到水裡的東西,而斜著看會看到更多的倒影。這個效應在不透明物體的表面也會存在,這一項就是來描述這個效應的。

G(l,v,h):Geometry function 反映了由於物體表面的凹凸不平導致的光線的損失。看下下面這圖就明白了。

D(h):Normal distribution function 這就是討論得比較多的高光函數了, 這個函數決定了高光的分布,不同的高光係數大概就是產生這樣的效果。

有這個公式計算出來的可以理解為是specularity,再和diffuse color相加即可得到物體在該像素點的成色。diffuse color 可以簡單的理解成是物體的帶明暗的固有色。當然,實際的渲染中還需要考慮環境對於物體的影響,這部分就不展開了。

(PBR部分的圖片的出處均在以下兩個網站)

Learn OpenGL, extensive tutorial resource for learning Modern OpenGL

(這個文章用豐富的圖片作為例子解釋了最主流的BRDF的計算過程,文章的最後給了一個Albedo+Normal+Metallic+Roughness+AO的例子)

Jordan Stevens - Technical Artist

(給出BRDF模型的Unity shader實現,以及各種不同的核函數,讀後感覺十分震撼)

這樣一來,Shader里的Albedo,Normal,Metallic,SmoothnessOcclusion就不難理解了。

Height Map:作為輔助normal map 的更加高級的貼圖,效果(右)是比normal 貼圖(中) 好不少。

Emission 讓物體發光。這裡的發光是會記錄到光照的渲染流程里的(foward rendering慎用)。當然,和Maya的發光不同,這裡的發光是不會自帶那種模糊特效的,想要做好看的霓虹效果還是老老實實的加bloom吧。

Secondary Map 會疊加在第一層的紋理上,一般是用來做細節的。看下圖就懂了:

Render Queue 這個東西早應該放到這裡了。渲染隊列,簡單來說,數字大的會蓋住數字小的。注意檢測深度的最大渲染隊列數是2500。

嗯,由於沒有美工妹子幫忙做Metallic 和 Smoothness貼圖,所以材質部分就馬馬虎虎的過了吧。

==未完待續==

終於把場景搭好了,可是現在的場景還是別樣的丑呢。之後還有光線烘焙和加特效的環節,希望大家繼續關注哦。

推薦閱讀:

著色器語言之uniform限制符
小隨筆:利用Shader給斯坦福兔子長毛和實現雪地效果

TAG:Unity游戏引擎 | 渲染 | 计算机图形学 |