URP | Normal法線貼圖
法線概念
法線是有 正反區(qū)別(-1,1)

DirectX12 里Y軸是N方向

不同平臺使用的貼圖正反是不一樣的。
不同平臺使用的法線格式

HLSL調(diào)用法線貼圖注意哪些
結(jié)構(gòu)體
在頂點結(jié)構(gòu)體中,我們需要獲取模型的頂點法線,頂點切線。

輸出到片元著色器結(jié)構(gòu)體中

這里說一下UV信息,為什么是float4類型,
這里的uv.xy儲存的是漫反射貼圖的uv,uv.zw儲存的法線的uv信息。
這樣的好處是合并到一起。
法線,切線,副切正常類型是,
定義變量
屬性里定義一張法線貼圖。以及控制法線的變量


把一些變量放到C-buffer里。貼圖采樣也是。

頂點階段
頂點階段,需要把頂點法線,頂點切線轉(zhuǎn)換成世界空間下。
第一部分 儲存的顏色貼圖,法線貼圖的UV采樣信息

第二部分,把頂點法線,頂點切線轉(zhuǎn)換成世界空間,輸出。
計算出副切線的數(shù)值。并在乘切線的w值判斷正負,在乘負奇數(shù)縮放影響因子。

這里注意,
v.tangentOS.w
值為-1或者1,由DCC軟件中的切線自動生成,和頂點的環(huán)繞順序有關。
unity_WorldTransformParams.w
定義于unityShaderVariables.cginc中.
模型的Scale值是三維向量,即xyz,當這三個值中有奇數(shù)個值為負時(1個或者3個值全為負時),unity_WorldTransformParams.w = -1,否則為1.
第三部分 ?計算出世界空間下的頂點坐標。儲存到法線,切線,副切線的W通道中。

注意:這里為什么需要把頂點位置穿片元著色器,我們是需要計算 視角向量(ViewDir)
還有第二套寫法,
擴展 在頂點著色器階段,計算視角向量。
片元結(jié)構(gòu)體
切線和法線,都是float3的類型了,

在頂點階段計算出viewDirWS 世界空間下的視角方向。

片元著色器
在片元著色器階段計算出TBN矩陣,這里需要把法線的信息和模型的法線信息混合起來,
因為我們上面是使用模型頂點信息計算的高光,或者漫反射。 那單獨看一下模型法線信息。

這個結(jié)果就缺少細節(jié),,看一下漫反射。

現(xiàn)在法線信息 是有倆部分組成 ? ,法線貼圖是增加細節(jié)的。
新法線信息 = ?模型頂點法線 + 法線貼圖
第一部分讀取法線貼圖
????????讀取貼圖,????
計算TBN ? 在讀取貼圖,增加一個控制貼圖的強度的數(shù)值。
貼圖信息和TBN結(jié)合
獲取視角方向,光照方向 計算出半角向量
使用新法線計算出漫反射

增加上前面學習到的漫反射,高光發(fā)射
效果

代碼實現(xiàn)