一文看懂材質/紋理 Material, Texture, Shading, Shader 的區別
在計算機圖形學和三維設計中,有幾個容易混淆的概念。今天我們來一舉拿下。
概念整理
英文 | 中文 | 本質 | 釋義 |
---|---|---|---|
Material | 材質 | 數據集 | 表現物體對光的交互,供渲染器讀取的數據集,包括貼圖紋理、光照算法等 |
Texture mapping | 紋理貼圖) | 圖像映射規則 | 把存儲在內存里的位圖,通過 UV 坐標映射到渲染物體的表面 |
Shading | 底紋、陰影 | 光影效果 | 根據表面法線、光照、視角等計算得出的光照結果 |
Shader | 着色器) | 程序 | 編寫顯卡渲染畫面的算法來即時演算生成貼圖的程序 |
GLSL | 程序語言 | OpenGL 着色語言 |
可以這么總結:
Material 是表現 Shading 的數據集。其他幾個概念都是生成這一數據集的資源或者工具。
這么多概念,無非是為了完成一個共同目標:用計算機表現真實可信的 Shading。
Shading 是真實世界中的光影效果,它是由物體表面材質、燈光、觀察者的視角等多種因素共同決定的。要實現計算機的模擬生成,是一個非常復雜的過程。不過它的原理大概可以簡化為一個函數:
Intensity = Material (Light, Eye)
也就是說,光影的強度,是由 a.照在材質上的光 b.視線 共同決定的。
如何制造 Shading 效果?
萬物看起來不盡相同,它們有各自的材質和紋理。
紋理(Texture)是什么?
Texture is pattern or image applied to a surface to change its color, shininess or just about any other part of its appearance. —— Texture introduction - Udacity
紋理就是一段有規律、可重復的圖像。利用紋理,我們可以非常取巧地讓三維物體看起來更真實。
方法一:貼上皮膚
貼圖可以說是最簡單的材質方法:
- 選定物體表面的某些區域
- 更改這個區域的一些屬性(如顏色、反光度、透明度等)
那么 UV Mapping 又是什么?跟 Texture Mapping 有什么區別呢?
可以這么理解,Texture Mapping 是目標,把材質用一種規則映射到物體表面。而 UV Mapping 就是映射的規則。在這個規則中,給三維體每一個頂點增加兩個值 U 和 V,它們記錄了三維表面和二維表面的坐標對應關系:
via Texture UVs
有了映射關系,我們就可以分門別類地把影響光照的不同參數,都通過圖片映射到三維幾何體上。這些參數包括:
-
Diffuse Map 漫反射:模擬一個發光物對物體的方向性影響(Directional Impact)。它是光照模型中最顯著的組成部分
-
Specular/Reflection Map 鏡面:模擬有光澤物體上面出現的亮點,它的顏色更接近光而不是物體的顏色
-
Normal/Bump Map 法線:決定物體形狀的垂直於它的法線向量,提供有關物體表面深度的細節。每一種顏色代表了不同的軸向,看起來類似這樣:
-
Displacement Map 位移:使用高度圖將經過紋理化的表面的實際幾何點位置,沿着表面法線根據保存在紋理中的數值進行移位。相比法線,位移貼圖更多用於大規模的地形材質,包括懸崖、岩石等
-
Ambient Map 環境
-
Gloss/Roughness Map 光澤
方法二:長出皮膚
貼上皮膚的方法雖好,但是局限也很明顯。如果沒有合適的圖像,或者要創建真實世界中罕見的材質,皮膚就不好找了。這個時候需要讓程序幫忙「生長」出新的皮膚。
我們把這種程序叫做 Shaders。
如果你還記得,Shading 是始終如一的終極目標,那么應該就能明白為什么實現這個目標的程序叫做 Shaders 了。
它實際上是一個程序片段、一系列的指令,可以將三維 Mesh(網格)以指定方式與顏色、貼圖等組合,完成復雜的計算輸出(渲染器可讀取的點和顏色的對應關系),會對屏幕上的每個像素同時下達命令。也就是說,代碼必須根據像素在屏幕上的不同位置執行不同的操作。就像活字印刷,你的程序就像一個 function(函數),輸入位置信息,輸出顏色信息,當它編譯完之后會以相當快的速度運行。
為什么 Shaders 運行特別快?因為它們常常運行在專門為並行處理(parallel processing)而設計的 GPU 上面。
最后一個問題,用什么來寫 shaders 程序呢?答案是 OpenGL 着色器語言 (GLSL) 。GLSL 是用類 C 語言寫成的,它為圖形計算量身定制,包含一些針對向量和矩陣操作的有用特性。
好了,今天涉及到的概念實在太多了。希望對大家進入三維世界玩耍有所幫助。