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


極端常用:

UnityObjectToClipPos(v.vertex);

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

 

mul(unity_ObjectToWorld, v.vertex);

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

 

UnityObjectToWorldNormal(v.normal);

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

 

UnityWorldSpaceLightDir(i.worldPos.xyz);

僅前向渲染,世界空間頂點位置 ==》世界空間光源方向,多用於片元着色器,一般會順帶歸一化(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"

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

 

陰影投射:

TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)

用於頂點着色器中計算陰影在裁剪空間中的位置,並把結果輸出到結構體中,o為輸出的結構體;

因為這個宏中使用了v.vertex和v.normal,故須保證:1.頂點着色器的輸入結構體名為v;2.輸入結構體中頂點變量名為vertex;3.輸出結構體中包含法線信息且名為normal

 

V2F_SHADOW_CASTER;

用於在片元着色器的輸入結構體中定義陰影投射所需的變量,主要包含的是深度圖和陰影映射紋理等聲明

 

SHADOW_CASTER_FRAGMENT(i)

片元着色器中對陰影投射結果進行計算,並輸出到深度圖和陰影映射紋理中,i為輸入的結構體

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM