簡(jiǎn)述47種Shader Map的渲染原理與制作方法
在Shader中會(huì)使用各種不同圖參與渲染,所以簡(jiǎn)單地總結(jié)下各種圖的渲染原理、制作方法,最后面幾種是程序生成圖。
1. Albedo
2. Diffuse(Photographic)

從上圖可以看出來(lái),Albedo是去掉Diffuse的光照和陰影生成的,而在pbr工作流下必須要用Albedo。轉(zhuǎn)換方法:How to Make an Albedo Texture from a Diffuse Texture
3. Alpha Map
注意:jpg沒(méi)有alpha通道,png也沒(méi)有alpha通道,顯示的alpha是根據(jù)rgb計(jì)算的灰度作為alpha使用。另外安卓平臺(tái)ETC1也沒(méi)有alpha通道。
4. Bump Map
5. Height Map
基于高度的潮濕地面

6. Normal Map
Bump Map是凹凸貼圖,常用的有兩種:一種是Emboss Bump Map(浮雕凹凸貼圖,使用的Height Map),另一種是Dot3 Bump Map(點(diǎn)乘凹凸貼圖,使用的是Normal Map)
7. Mask Map
Mask用途比較多,常用來(lái)標(biāo)識(shí)不同物體,比如標(biāo)識(shí)建筑上反光的窗戶、地面的積水、皮膚上汗水等。

8. Light Map(圖來(lái)源)

9. Lut
Lut(查找表lookup table)可以用于優(yōu)化復(fù)雜光照的渲染,比如lambert blinn-phong可以把(NL,NH)作為uv坐標(biāo),將光照計(jì)算存儲(chǔ)在一張貼圖中,這樣渲染時(shí)復(fù)雜的計(jì)算過(guò)程就優(yōu)化為紋理采樣了。另外皮膚、毛發(fā)之類復(fù)雜計(jì)算都可以用此方法優(yōu)化。
10. Emission Map

如果要表現(xiàn)更好的效果,自發(fā)光還要配合HDR/ToneMap/Bloom。
11. Metallic Map/Roughness
12. Specular Map/ Smoothness

圖來(lái)源
高光工作流可以不受限于PBR,能做非真實(shí)渲染,而金屬工作流則對(duì)入門者更友好,限制在物理渲染的框架中,不至于渲染的太糟,當(dāng)然金屬工作流也可以做風(fēng)格化的渲染。如果是用Substance Painter或者M(jìn)armoset Toolbag制作,這兩種方式都支持導(dǎo)出的。
13. Gloss Map
14. Smothness Map
15. Roughness Map
光澤貼圖和高光貼圖是不同的,它類似平滑貼圖/粗糙貼圖,表示物體表面的平滑粗糙程度,而高光貼圖存儲(chǔ)的是高光的強(qiáng)度,金屬貼圖存儲(chǔ)的是金屬度。
16. pbr(sbsar)

17. Ramp Map
Ramp Map常用于卡通渲染,可以用于手工調(diào)節(jié)漫反、高光、陰影等,但是這比較依賴美術(shù)畫圖的功力,道理簡(jiǎn)單,渲染的好看卻不容易。
圖來(lái)自米哈游的技術(shù)解說(shuō)米哈游極樂(lè)凈土的卡通渲染

18. Detail Map(Albedo Emission Specular Normal 等)
Detail Map主要解決相機(jī)靠近模型時(shí)貼圖精度不足的問(wèn)題,比如地面、皮膚、樹木等等靠近看會(huì)很模糊,用一張尺度更小的坑坑洼洼的圖來(lái)增加細(xì)節(jié)。左上是模糊的地面,右上是細(xì)節(jié)圖,最下面是增加細(xì)節(jié)后的地面。

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

20. Jitter Map/Sparke Map/Glitter Map
這種閃爍的噪點(diǎn)主要用于沙子、雪等渲染,主要用于表現(xiàn)顆粒感。這可以用噪聲圖來(lái)用于渲染,也可以用函數(shù)生成,一般類似frac(a*sin+b)這樣形式,可以搭配WorldPos、ViewPos、Time來(lái)組合成函數(shù)。

21. Noise Map
Noise有很多種:白噪聲、藍(lán)噪聲、perlin噪聲、simplex噪聲、Voronoi噪聲。另外推薦個(gè)噪聲圖編輯器:numberflow

22. Splatting Map
最常用于地形渲染,單獨(dú)一張control texture作為多層貼圖的混合系數(shù),既可以用于顏色混合,也可以用于法線混合。

23. Lens Map(Rain/Snow/Freeze/Glare/Flare/Flash/Gleam/starburst)
做鏡頭效果會(huì)需要很多類似雨滴、雪花、臟跡、冰凍、炫光、星星等貼圖。比如下面鏡頭雨滴。

24. CubeMap
Arm公司做的Ice Cave把CubeMap用在反射、折射、陰影,效果很贊(ice cave)

25. MatCap Map
Matcap的原理將法線轉(zhuǎn)換view坐標(biāo)系,取XY作為UV采樣一張貼圖,原理如下圖

對(duì)于場(chǎng)景色調(diào)比較統(tǒng)一、不要求精準(zhǔn)光照的情況,這是種運(yùn)行效率非常高的渲染方式。

26. 3D Texture
3d紋理最常用于體渲染,比如云、高度霧等。Unity不支持3d紋理的文件格式,但是支持動(dòng)態(tài)創(chuàng)建Texture3D,這樣可以自己保存為asset格式或者自定義格式,在運(yùn)行時(shí)轉(zhuǎn)換為Texture3D。因?yàn)轶w渲染比較常用的方式是raymatching,步進(jìn)次數(shù)少效果很難表現(xiàn)出來(lái),在移動(dòng)端效率比較低。圖來(lái)HorizonZeroDawn

27. Translucency Map(Thickness Map、反向AO、單散射)
主要用于半透明物體,比如闊葉植被、玉等

28. Ambient Occlusion Map
AO的計(jì)算方法是從頂點(diǎn)的半球發(fā)出射線,檢測(cè)射線是否與網(wǎng)格相交,下圖的遮擋值是5/7。圖來(lái)源

因?yàn)锳O圖噪點(diǎn)較多,即使增加射線的數(shù)量效果也不是很好,而體遮擋法能很好解決這個(gè)問(wèn)題。AO如果作為后處理的話,SSVO、SSDO是比較流行的方法。

29. DUDV Map
DuDv圖看上去像蚯蚓爬過(guò)的法線圖,一般用RG兩個(gè)通道存儲(chǔ)數(shù)據(jù),是根據(jù)法線求導(dǎo)后再模糊處理存儲(chǔ)的數(shù)據(jù),類似與Parallax Map的用途,它也用于扭曲,比如下圖用于扭曲水面倒影。圖來(lái)源

30. Flow Map
Flow map存儲(chǔ)的是向量場(chǎng)數(shù)據(jù),可以用于控制水面UV,比如下圖石頭周圍一圈一圈水紋,制作工具有很多,比如flowmap制作工具

31. Ripple Map
常用于雨滴水紋、物體落入水中的水紋等,可以算是flowmap的一種。

32. Distort Map
扭曲圖比較常用于半透物體,用于扭曲背景。比如下圖冰塊。

33. Displacement Map
34. Vector Displacement Map
這兩種圖常用鑲嵌,不過(guò)Displacement Map相當(dāng)于高度圖,而Vector Displacement Map存儲(chǔ)的是三維向量,可以更好地細(xì)分模型。比如用地面蘑菇、地衣、耳朵等。

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

36. Cavity Map
縫隙圖存儲(chǔ)的是比普通AO更小的AO信息,主要用于表現(xiàn)裂縫。制作方法參考:縫隙圖筆記

37. Curvature Map
曲率圖和縫隙圖不同的是它主要用于表現(xiàn)邊緣、凹凸等效果,用于耳朵、眉骨、鼻子渲染效果會(huì)很好,利用DDX/DDY或fwidth也可以動(dòng)態(tài)計(jì)算曲率。

38. Anisotropic Map
有些物體的光照會(huì)呈現(xiàn)各向異性,比如頭發(fā)、金屬等,下圖是三種頭發(fā)渲染的方式(環(huán)形、kajiya、Scheuermann)都用到各向異性的貼圖用于高光偏移。

39. Derivative Map
這是由頑皮狗大神Morten Mikkelsen首先提出法線圖的衍生方式(Bump Mapping Unparametrized Surfaces on the GPU),因?yàn)橛梅ň€圖一般在切線空間用于光照計(jì)算,而這種方法則不需要切線空間的參與,效率和效果都會(huì)更好,不用法線圖,而是表面梯度圖,和高度梯度圖是不同的。不過(guò)這文章讀起來(lái)挺心累的,最好參考Jim Blinn大神的凹凸貼圖原理。

40. Foam Map
泡沫貼圖、浪花貼圖用于水面超過(guò)一定值時(shí)泡沫會(huì)和水面顏色混合,水面頂點(diǎn)越高泡沫透明度越大。

41. Caustics Map
水紋貼圖:因?yàn)樗嫫鸱?、焦散?dǎo)致水底某些地方會(huì)比周圍更亮,可以用Projector渲染水紋,也可以參考GPU Gems的反向計(jì)算折射光線來(lái)采樣太陽(yáng)環(huán)境圖的方法(Rendering Water Caustics),還有一個(gè)制作水紋的工具(水紋生成器+Unity Demo)

42.Bent Normal Map (經(jīng)大神王滕昊提醒補(bǔ)充加上)
Bent Normal 常用于離線AO渲染中,是對(duì)原始法線修改后的向量,考慮周圍遮擋情況使其指向光線傳入的主方向,如下圖Bend Normal 比原始法線偏右。用于光照計(jì)算或者環(huán)境光采樣用Bend Normal在模型邊緣處會(huì)得到更好的AO和光照效果。

43. Depth Map
44. Camera Depth Map
45. Camera Depth Normal Map
相機(jī)深度圖可以用于渲染水、霧、掃描、半透物體等,這里有個(gè)不錯(cuò)文章有關(guān)深度法線圖的:深度與法線圖

46. Grab Pass Texture
GrabPass可以用于熱浪扭曲、半透冰塊、沖擊波等需要背景用于渲染的情況,在移動(dòng)端效率不高,不要求動(dòng)態(tài)背景時(shí)可以用Cubemap來(lái)代替。

47. Vertex Texture Fetch
在Vertex Shader中讀取上一幀水面高度紋理,在當(dāng)前幀繼續(xù)波動(dòng),這可以用于交互式水渲染,不過(guò)頂點(diǎn)紋理拾取是比較耗費(fèi)資源的操作,不需要交互的水面是用不到的,對(duì)于海戰(zhàn)類型的游戲會(huì)比較有用。
