Unity Shader經常使用函數,標籤,指令,宏總結(持續更新)

極端經常使用:git

UnityObjectToClipPos(v.vertex);github

最基本的頂點變換,模型空間 ==》裁剪空間函數

 

mul(unity_ObjectToWorld, v.vertex);spa

頂點:模型空間 ==》世界空間,多用於頂點着色器orm

 

UnityObjectToWorldNormal(v.normal);htm

法線:模型空間 ==》世界空間,多用於頂點着色器,float3(歸一化後fixed3)索引

 

UnityWorldSpaceLightDir(i.worldPos.xyz);ip

僅前向渲染,世界空間頂點位置 ==》世界空間光源方向,多用於片元着色器,通常會順帶歸一化(fixed3)字符串

 

UnityWorldSpaceViewDir(i.worldPos.xyz);數學

世界空間頂點位置 ==》世界空間視線方向,多用於片元着色器,通常會順帶歸一化(fixed3)

 

P.S.通常[0,1]範圍內的儘可能用低精度fixed類型,如單位矢量,顏色等

 

Tags{"lightmode"="forwardbase"}(字符串不區分大小寫,編譯時會自動轉爲全部字母大寫)

指示光照模型爲前向渲染的基本模式

 

#include "UnityCG.cginc"(字符串不區分大小寫,編譯時會自動轉爲全部字母大寫)

包含大量基本內置函數,宏等,通常自帶

 

#include "lighting.cginc"(字符串不區分大小寫,編譯時會自動轉爲全部字母大寫)

包含基本光照屬性,如 _LightColor0

 

UNITY_LIGHTMODEL_AMBIENT(使用大寫)

環境光,通常取前三個份量rgb(xyz);基本光照模型須要有環境光,漫反射,高光等

 

 

基本紋理&法線貼圖:

TRANSFORM_TEX(v.uv, _MainTex);

基本紋理變換,用於頂點着色器,至關於v.uv*_MainTex_ST.xy + _MainTex_ST.zw;(其中xy存縮放,zw存偏移,對應面板參數);_MainTex_ST需額外定義

 

tex2D(_MainTex, i.uv);

基本紋理採樣,用於片元着色器;通常會定義染色屬性並與之相乘獲得反射率(albedo),反射率做爲環境光和漫反射計算的因子

 

UnpackNormalWithScale(packedNormal, _BumpScale);

反映射法線貼圖採樣結果獲得頂點空間中的法線方向,同時計算凹凸映射的縮放;packedNormal爲法線貼圖直接採樣結果,_BumpScale爲凹凸縮放值;法線貼圖必須進行導入設置爲Normal Map

 

UnityObjectToWorldDir(v.tangent.xyz);

方向(切線):模型空間 ==》世界空間,多用於頂點着色器

 

cross(worldNormal, worldTangent)*v.tangent.w

計算副法線,cross(,)兩個向量叉積,用於得知兩個座標軸求第三個座標軸朝向,w控制朝向的正負;知道三個朝向就能夠構造變換矩陣了

 

TANGENT_SPACE_ROTATION

獲得從模型空間到頂點空間的變換矩陣rotation,隨後可直接進行以下計算,例如:

mul(rotation, ObjSpaceLightDir(v.vertex));

模型空間頂點位置 ==》模型空間光源方向==》頂點空間光源方向

mul(rotation, ObjSpaceViewDir(v.vertex));

模型空間頂點位置 ==》模型空間視線方向==》頂點空間視線方向

 

 

多光源&前向渲染&光照衰減:

Tags{"lightmode"="forwardbase"}(第一個Pass,全局性通用計算,只計算一次,不用開啓混合)

Tags{"lightmode"="forwardadd"}(第二個Pass,根據光源數目不一樣可能屢次計算,需開啓混合)

前向渲染的兩種標籤,分別位於不一樣的兩個Pass,指示每一個Pass的光照模式

 

#pragma multi_compile_fwdbase

#pragma multi_compile_fwdadd

前向渲染的兩種指令,只有每一個Pass配置正確指令纔可能獲得正確的光照變量,如光照衰減值

 

UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos.xyz);

用於第二個Pass分別計算每一個光源的衰減,atten爲輸出的衰減值,i爲片元着色器的輸入結構體,其內部數學運算根據各個光照的類型不一樣複雜度不一,具體可參考:https://github.com/candycat1992/Unity_Shaders_Book/issues/47

 

 

接收投影:

SHADOW_COORDS(idx)

聲明陰影紋理採樣的座標,用於頂點着色器輸出結構體,idx爲下一個可用插值寄存器(TEXCOORD)的索引值

 

TRANSFER_SHADOW(o);

用於在頂點着色器中計算陰影紋理座標,並輸出到結構體中,o爲輸出的結構體;

由於這個宏中使用了v.vertex和a.pos,故須保證:1.頂點着色器的輸入結構體名爲v;2.輸入結構體中頂點變量名爲vertex;3.輸出結構體中頂點變量名爲pos

 

SHADOW_ATTENUATION(i);

用於在片元着色器中經過陰影紋理採樣的座標計算陰影值,i爲輸入的結構體

 

#include "AutoLight.cginc"

包含計算陰影所用的宏,例如上述三種

相關文章
相關標籤/搜索