極端經常使用: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"
包含計算陰影所用的宏,例如上述三種