18.UntiyShader基礎(chǔ)紋理
1.紋理映射-UV混合

步驟
1.讀取Texture中uv坐標(biāo)的顏色
2.將紋理顏色分別混合環(huán)境光和漫反射
核心代碼 (在上一篇的高光模型代碼中修改)
函數(shù)引用
tex2D() 傳入uv坐標(biāo), 返回紋理對于像素顏色
關(guān)于紋理的Warp Mode主要有兩種,一種是Repeat重復(fù)模式,一種是Clamp裁切模式 ?
Repeat模式,超出0-1,取小數(shù)位
Clamp模式,超出0-1,錯誤的結(jié)果
完整代碼, 素材也在目錄中
https://github.com/smartgrass/MyCodes/blob/main/ShaderLearning/Texture_uv.shader
2.凹凸映射-Bump

凹凸映射有兩種方式: 法線紋理 和 高度紋理(跳過)
法線紋理
存儲的是表面法線方向, 用RGB顏色保存法線向量的x,y,z信息
由于紋理RGB分量在[0,1]上 , 需要映射到法線方向的分量的[-1,1]上
????????normal=pixel*2-1
向量的坐標(biāo)系有兩種: ?切線空間 和 模型空間(跳過)
法線紋理一般用的是切線空間

理解
利用法線貼圖中頂點法線向量,進行漫反射光照(Lambert定律)
步驟:
1.獲取法線貼圖中的頂點法線向量nor, 以及頂點指向燈光的向量lightDir,
2.將nor和lightDir轉(zhuǎn)換到同個空間, 切線空間或世界空間都可以
3.利用Lambert計算像素亮度值, bump = max(0, dot(nor,lightDir))
4.亮度結(jié)果疊加到漫反射中,diffuse*=bump;
核心代碼(切線空間)
函數(shù)引用
ObjSpaceLightDir(float4 v)? 輸入模型空間頂點坐標(biāo), 模型空間中從頂點指向燈光的向量
UnpackNormal(fixed4 packnormal)? 顏色映射到法線向量

由于紋理壓縮格式不同, 解析上有區(qū)別
在unity中, 如果Texture Type為Normal map ,壓縮格式則會變?yōu)镈XT5nm,
但unity的UnpackNormal()都幫我們處理好了
效果

完整代碼
https://github.com/smartgrass/MyCodes/blob/main/ShaderLearning/Texture_bump.shader
選切線空間還是世界空間? ?
差別不大, 跟著5.x選世界空間

如果需要寫世界空間代碼, 需要注意, 結(jié)構(gòu)體無法傳3x3的矩陣, 那么可以使用3個float3來保存

3.漸變紋理-RampTex


核心代碼
代碼思路
計算dot(worldLightDir,worldNormal) = cosθ 得到[-1,1] 的亮度值,
映射到uv的[0,1]上, 則是 *0.5+0.5, 從而讀取漸變圖坐標(biāo)的顏色值
最后疊加到材質(zhì)顏色上 albedo*=ramp;
理解
頂點漫反射的亮度從0到1的映射到漸變紋理坐標(biāo)顏色上
4.遮罩紋理-SpecularMask

遮罩紋理可以更加精細地控制光照細節(jié),可以得到更細膩的效果
和漸變紋理類似,只不過遮罩紋理是對高光部分進行混合。
核心代碼
這里取r分量作為淹碼值
最后兩部分相對簡單...