(轉)簡述47種Shader Map的渲染原理與制作方法


Shader中會使用各種不同圖參與渲染,所以簡單地總結下各種圖的渲染原理、制作方法,最后面幾種是程序生成圖。

1. Albedo

2. Diffuse(Photographic)

從上圖可以看出來,Albedo是去掉Diffuse的光照和陰影生成的,而在pbr工作流下必須要用Albedo

轉換方法:How to Make an Albedo Texture from a Diffuse Texture

3. Alpha Map

注意:jpg沒有alpha通道,png也沒有alpha通道,顯示的alpha是根據rgb計算的灰度作為alpha使用。

另外安卓平台ETC1也沒有alpha通道。

4. Bump Map

5. Height Map

基於高度的潮濕地面

6. Normal Map

Bump Map是凹凸貼圖,常用的有兩種:一種是Emboss Bump Map(浮雕凹凸貼圖,使用的Height Map),

另一種是Dot3 Bump Map(點乘凹凸貼圖,使用的是Normal Map)

7. Mask Map

Mask用途比較多,常用來標識不同物體,比如標識建築上反光的窗戶、地面的積水、皮膚上汗水等。

8. Light Map(圖來源)

9. Lut

Lut(查找表lookup table)可以用於優化復雜光照的渲染,比如lambert blinn-phong可以把(NL,NH)作為uv坐標,

將光照計算存儲在一張貼圖中,這樣渲染時復雜的計算過程就優化為紋理采樣了。另外皮膚、毛發之類復雜計算都可以用此方法優化。

10. Emission Map

如果要表現更好的效果,自發光還要配合HDR/ToneMap/Bloom

11. Metallic Map/Roughness

12. Specular Map/ Smoothness

圖來源

高光工作流可以不受限於PBR,能做非真實渲染,而金屬工作流則對入門者更友好,限制在物理渲染的框架中,不

至於渲染的太糟,當然金屬工作流也可以做風格化的渲染。如果是用Substance Painter或者Marmoset Toolbag

作,這兩種方式都支持導出的。

13. Gloss Map

14. Smothness Map

15. Roughness Map

光澤貼圖和高光貼圖是不同的,它類似平滑貼圖/粗糙貼圖,表示物體表面的平滑粗糙程度,而高光貼圖存儲的是高

光的強度,金屬貼圖存儲的是金屬度。

16. pbr(sbsar)

17. Ramp Map

Ramp Map常用於卡通渲染,可以用於手工調節漫反、高光、陰影等,但是這比較依賴美術畫圖的功力,道理簡單,渲

染的好看卻不容易。

圖來自米哈游的技術解說米哈游極樂凈土的卡通渲染

18. Detail Map(Albedo Emission Specular Normal )

Detail Map主要解決相機靠近模型時貼圖精度不足的問題,比如地面、皮膚、樹木等等靠近看會很模糊,用一張尺度更

小的坑坑窪窪的圖來增加細節。左上是模糊的地面,右上是細節圖,最下面是增加細節后的地面。

19. Gradient Map(用於Color Gradient顏色分級、顏色校正等)

 

20. Jitter Map/Sparke Map/Glitter Map

這種閃爍的噪點主要用於沙子、雪等渲染,主要用於表現顆粒感。這可以用噪聲圖來用於渲染,也可以用函數生成,一般

類似frac(a*sin+b)這樣形式,可以搭配WorldPosViewPosTime來組合成函數。

 

21. Noise Map

Noise有很多種:白噪聲、藍噪聲、perlin噪聲、simplex噪聲、Voronoi噪聲。

另外推薦個噪聲圖編輯器:numberflow

 

 

22. Splatting Map

最常用於地形渲染,單獨一張control texture作為多層貼圖的混合系數,既可以用於顏色混合,也可以用於法線混合。

 

23. Lens Map(Rain/Snow/Freeze/Glare/Flare/Flash/Gleam/starburst)

做鏡頭效果會需要很多類似雨滴、雪花、臟跡、冰凍、炫光、星星等貼圖。比如下面鏡頭雨滴。

 

 

24. CubeMap

Arm公司做的Ice CaveCubeMap用在反射、折射、陰影,效果很贊(ice cave)

 

 

25. MatCap Map

Matcap的原理將法線轉換view坐標系,取XY作為UV采樣一張貼圖,原理如下圖

 

 

對於場景色調比較統一、不要求精准光照的情況,這是種運行效率非常高的渲染方式。

 

 

26. 3D Texture

3d紋理最常用於體渲染,比如雲、高度霧等。Unity不支持3d紋理的文件格式,但是支持動態創建Texture3D

這樣可以自己保存為asset格式或者自定義格式,在運行時轉換為Texture3D。因為體渲染比較常用的方式是raymatching

步進次數少效果很難表現出來,在移動端效率比較低。圖來HorizonZeroDawn

 

 

27. Translucency Map(Thickness Map、反向AO、單散射)

主要用於半透明物體,比如闊葉植被、玉等

 

 

28. Ambient Occlusion Map

AO的計算方法是從頂點的半球發出射線,檢測射線是否與網格相交,下圖的遮擋值是5/7圖來源

因為AO圖噪點較多,即使增加射線的數量效果也不是很好,而體遮擋法能很好解決這個問題。AO如果作為后

處理的話,SSVOSSDO是比較流行的方法。

 

29. DUDV Map

DuDv圖看上去像蚯蚓爬過的法線圖,一般用RG兩個通道存儲數據,是根據法線求導后再模糊處理存儲的數據,類似與

Parallax Map的用途,它也用於扭曲,比如下圖用於扭曲水面倒影。圖來源

 

 

30. Flow Map

Flow map存儲的是向量場數據,可以用於控制水面UV,比如下圖石頭周圍一圈一圈水紋,制作工具有很多,

比如flowmap制作工具

 

 

31. Ripple Map

常用於雨滴水紋、物體落入水中的水紋等,可以算是flowmap的一種。

 

 

32. Distort Map

扭曲圖比較常用於半透物體,用於扭曲背景。比如下圖冰塊。

 

 

33. Displacement Map

34. Vector Displacement Map

這兩種圖常用鑲嵌,不過Displacement Map相當於高度圖,而Vector Displacement Map

存儲的是三維向量,可以更好地細分模型。比如用地面蘑菇、地衣、耳朵等。

35. Radiosity Normal Map

半條命首先引入的光照貼圖方式,具體參考:Radiosity Normal Map,另外抵抗:人類隕落也有使用這種方法:抵抗中的光照

36. Cavity Map

縫隙圖存儲的是比普通AO更小的AO信息,主要用於表現裂縫。制作方法參考:縫隙圖筆記

 

 

37. Curvature Map

曲率圖和縫隙圖不同的是它主要用於表現邊緣、凹凸等效果,用於耳朵、眉骨、鼻子渲染效果會很好,利用DDX/DDYfwidth也可以動態計算曲率。

 

 

38. Anisotropic Map

有些物體的光照會呈現各向異性,比如頭發、金屬等,下圖是三種頭發渲染的方式(環形、kajiyaScheuermann)都用

到各向異性的貼圖用於高光偏移。

 

 

39. Derivative Map

這是由頑皮狗大神Morten Mikkelsen首先提出法線圖的衍生方式(Bump Mapping Unparametrized Surfaces on the GPU),

因為用法線圖一般在切線空間用於光照計算,而這種方法則不需要切線空間的參與,效率和效果都會更好,不用法線圖,

而是表面梯度圖,和高度梯度圖是不同的。不過這文章讀起來挺心累的,最好參考Jim Blinn大神的凹凸貼圖原理

 

40. Foam Map

泡沫貼圖、浪花貼圖用於水面超過一定值時泡沫會和水面顏色混合,水面頂點越高泡沫透明度越大。

圖來源

 

 

41. Caustics Map

水紋貼圖:因為水面起伏、焦散導致水底某些地方會比周圍更亮,可以用Projector渲染水紋,也可以參考GPU Gems

的反向計算折射光線來采樣太陽環境圖的方法Rendering Water Caustics),還有一個制作水紋的工具(水紋生成器+Unity Demo

 

 

42.Bent Normal Map (經大神王滕昊提醒補充加上)

Bent Normal 常用於離線AO渲染中,是對原始法線修改后的向量,考慮周圍遮擋情況使其指向光線傳入的主方向,

如下圖Bend Normal 比原始法線偏右。用於光照計算或者環境光采樣用Bend Normal在模型邊緣處會得到更好的AO和光照效果。

43. Depth Map

44. Camera Depth Map

45. Camera Depth Normal Map

相機深度圖可以用於渲染水、霧、掃描、半透物體等,這里有個不錯文章有關深度法線圖的:深度與法線圖

 

 

46. Grab Pass Texture

GrabPass可以用於熱浪扭曲、半透冰塊、沖擊波等需要背景用於渲染的情況,在移動端效率不高,不要求動

態背景時可以用Cubemap來代替。

 

 

47. Vertex Texture Fetch

Vertex Shader中讀取上一幀水面高度紋理,在當前幀繼續波動,這可以用於交互式水渲染,不過頂點

紋理拾取是比較耗費資源的操作,不需要交互的水面是用不到的,對於海戰類型的游戲會比較有用。

   

來自 <https://zhuanlan.zhihu.com/p/27339998>

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM