天天看點

對Unity3D的PBR的初步研究

demo視訊

demo視訊2

最近經常聽到PBR(Physically Based Rendering)技術的讨論,我一開始其實比較抗拒的。畢竟對于畫面和運作效率,我一直偏向于後者。不過最近玩了一些比較優秀的遊戲作品,比如《鎮魔曲》等,發現好的畫面還是非常吸引人的,于是開始研究一下PBR技術的用法。

傳統的貼圖渲染技術,一般是使用3張貼圖來表現模型的效果:漫反射貼圖、法線貼圖和高光貼圖。物體能讓肉眼看到的基本顔色,都是通過漫反射貼圖來表現的,然後通過法線貼圖讓模型在細節上産生有凹凸的感覺。最後通過高光貼圖控制模型不同部分的高光顯示不一樣,讓人感覺到同一個模型上有不同的質感。由于光照模型産生高光的銳度不一樣,還需要通過一個參數去調節高光的整體銳度。

由于傳統的渲染技術是基于貼圖的,是以使用同一張法線貼圖和高光貼圖的模型實際上産生高光的整體是一樣的,隻是通過法線貼圖細節上的不一樣,讓不同部位的高光方向稍微不同,然後高光貼圖等于是一張過濾圖,讓某些部位的高光顯示強弱發生一點變化。

PBR的渲染使用了4張基本貼圖:漫反射貼圖、金屬度(高光度)貼圖、法線貼圖和環境貼圖。

漫反射貼圖和法線貼圖和傳統貼圖渲染使用的差别不大,差別是漫反射貼圖最好把上面的光照資訊(比如一些畫上去或者烘焙的假光影)去掉,把這些光影的效果交給渲染本身來實作。

差別最大的是金屬度貼圖。金屬度貼圖的rgb通道代表了金屬感的強弱,alpha通道代表了高光的銳度。和傳統的高光貼圖不一樣,它使用了金屬感和高光銳度兩個概念,讓物體的質感更豐富。高光貼圖隻是過濾的功能,但金屬度貼圖是一種物體表面的屬性,你可以控制物體上面某一個部位的反光程度和高光産生的強度,讓渲染的過程自動生成它該有的效果。

環境貼圖,是控制物體受影響的基本環境,一般是純黑色的,也就是完全受周圍真實環境的影響。但你可以在某些部位的貼圖上繪制一些固定的顔色,讓貼圖顔色和真實環境同時對模型産生影響。比如你要讓某個部位一直發光,不受外部光線的影響,可以在環境貼圖上控制。

下面做了一個例子:

我拿了一個漫威的冬兵(WinterSoldier)的模型,在完全沒有貼圖的情況下,他是這樣的:

對Unity3D的PBR的初步研究

然後我給他賦予了漫反射貼圖:

對Unity3D的PBR的初步研究

按照傳統的貼圖渲染做法,我給他賦予了法線貼圖和高光貼圖,效果如下:

對Unity3D的PBR的初步研究

可以看得出,法線貼圖和高光貼圖讓模型産生了質感,在手臂和腰帶扣子上,産生了類似金屬的質感。但也可以看出,模型計算的高光是整體的,也就是說雖然有不同的部位,但産生的高光是以整個角色一起算的,隻是某些部位把高光隐藏了而已。

接下來我把材質換成預設的Standard,預設會賦予了漫反射貼圖和法線貼圖

對Unity3D的PBR的初步研究

這時候的效果是這樣的:

對Unity3D的PBR的初步研究

效果視訊

由于我現在沒有設定金屬度貼圖,是以整個角色的金屬度和高光度是一樣的,看起來就像一個金屬的雕像。

接下來我使用他原來的高光貼圖做了一些修改,變成了金屬度貼圖,效果會變成這樣:

對Unity3D的PBR的初步研究

效果視訊

現在整個角色的形象變得鮮明,不同部位的質感差别很明顯,而且高光的感覺是單獨的,手臂上面有單獨的高光,衣服上的配飾的高光也是單獨的,看起來比較細膩和豐富。

這時候4張貼圖都已經使用了,由于冬兵的手臂雖然是金屬,但顔色會比較白,如果金屬度調得高了,會變黑。是以我在環境貼圖裡面對手臂部分稍微做了些調整。

對Unity3D的PBR的初步研究

這是一個比較簡單粗暴的制作過程,我感覺制作高光貼圖和制作金屬感貼圖最大的不一樣,是pbr的質感是以部位來做的,你可以感覺整個部位劃為一塊那樣做金屬感貼圖,也可以通過紋理細節來做一些部位的特殊效果,比如鏽迹等。做法很多,效果很豐富,但需要慢慢的調節才能看到正确的效果,中間的難度比隻是單純做一張過濾用的高光貼圖要難。