最近實做了Bump Mapping和Displacement Mapping,這兩者還算是相當基本的概念,可以很容易地用shader來做到real-time的效果,進一步研究即是更高深技術的Parallax Mapping和Relief Mapping,它可以更有效率地表現出更加真實的立體效果。
下表是我這週所整理出來,比較Bump, Normal, Displacement, Parallax, Relief Mapping之間的差異,若想要知道更多的細節,可以去研究paper。
Mapping | Concept | Map | Shader |
Bump mapping(1978) | 計算vertex的光強時,不是直接使用該vertex的原始法向量,而是在原始法向量上加上一個擾動得到修改法向量,經過光強計算,能夠產生凹凸不平的表面效果。No self-occlusion, No self-shadow, No silhouette。 | Bump map (Normal map) | Fragment shader |
Normal mapping (1996) | normal map表示法向量資訊,而法向量資訊可由height map微分而得到,texture的RGB表示法向量的XYZ,利用此資訊計算光強,產生凹凸陰影的效果。No self-occlusion, No self-shadow, No silhouette。 | Normal map | Fragment shader |
Displacement mapping (1984) | 直接作用於vertex,根據displacement map中相對應vertex的像素值,使vertex沿法向移動,產生真正的凹凸表面。 | Displacement map (Height map) | Vertex shader |
Parallax mapping (2001) (Virtual displacement mapping) | 沒有修改vertex的位置,以視線和height map計算較陡峭的視角給vertex較多的位移,較平緩的視角給vertex較少的位移,透過視差獲得更強的立體感。No self-occlusion, No self-shadow。 | Height map | Fragment shader |
Relief mapping(2005) (Steep Parallax Mapping) | 更精確地找出觀察者的視線與高度的交點,對應的texture座標則是位移的距離,所以能更正確地模擬立體的效果,可以產生self-occlusion, self-shadowing, view-motion parallax, and silhouettes。 | Height map | Fragment shader |
這裡名詞有許多歧異,可能是因為作法有很多種。做Bump mapping的時候,參考到使用Normal map來實做的教學,所以會將Bump mapping和Normal mapping都以前者名稱為主。不太清楚occlusion和shadow的差別,初步認知是前者陰影較淺(indirect lighting)而後者較深(direct lighting)。上頭的表格已經servey數次,希望沒有錯誤。
參考:WiKiBump, Normal, Displacement, Parallax, Relief Mapping。
隨意留個言吧:)~