Unity Shader常用函式總結

2021-08-22 04:49:42 字數 3737 閱讀 3438

數學函式

abs(x) :返回輸入引數的絕對值;

clamp(x,a,b):如果x小於a則返回a;如果x大於b則返回b;

cross(a,b):返回兩個三元向量的叉積;

degree(x):輸入引數為弧度值(radians),函式將其轉換為角度值;

determinant(m):計算矩陣的行列式因子;

dot(a,b):返回a和b的點積;

exp2(x): 2的x次方;

lerp(a,b,f):插值計算,

step(a, x)

:如果x,返回0;否則,返回1。

saturate(x)

:將輸入值限制在[0,1]之間

幾何函式

distance( pt1, pt2)

:兩點之間的歐幾里德距離(euclidean distance)

reflect(i, n)

:根據入射光方向向量

i,和頂點法向量n,計算反射光方向向量。其中i

和n必須被歸一化,需要非常注意的是,這個i

是指向頂點的;函式只對三元向量有效;

refract(i,n,eta)

:計算折射向量,i為入射光線,n為法向量,eta為折射係數;其中i和n

必須被歸一化,如果i

和n之間的夾角太大,則返回(0,0,0),也就是沒有折射光線;i是指向頂點的;函式只對三元向量有效。

紋理對映函式(

投影紋理查詢函式使用計算得到的投影紋理座標,並在使用之前會將該投影紋理座標除以透視值

)tex2d(sampler2d tex, float2 s)

:二維紋理查詢;

tex2dproj(sampler2d tex, float3 sq)

:二維投影紋理查詢

tex3d(sampler3d tex, float s)

:三維紋理查詢

texcube(samplercube tex, float3 s)

:查詢立方體紋理

texcubeproj (samplercube tex, float4 sq)

查詢投影立方體紋理

偏導函式

ddx(a)

:引數a

對應乙個畫素位置,返回該畫素值在x

軸上的偏導數

ddy(a)

:引數a

對應乙個畫素位置,返回該畫素值在y

軸上的偏導數

函式ddx

和ddy

用於求取相鄰畫素間某屬性的差值;函式

ddx和

ddy的輸入引數通常是紋理座標;函式

ddx和

ddy返回相鄰畫素鍵的屬性差值;

unityshader

巨集(

通道設定顯示硬體的各種狀態,例如能開啟alpha混合

​​​​​​​zwriteon | off  :設定深度寫模式,詳細內容後面的文章會講解到。

​​​​​​​fog

設定霧引數,詳細內容後面的文章會講解到。

​​​​​​​​​​​​​​alphatest

(less | greater | lequal | gequal| equal | notequal | always) cutoffvalue:開啟alpha測試

​​​​​​​blend

sourceblendmode |destblendmode :設定alpha混合模式 ​​​​​​​

color

color value:設定當頂點光照關閉時所使用的顏色

​​​​​​​colormaskrgb | a | 0 | any combination of r, g, b, a:設定顏色寫遮罩。設定為0將關閉所有顏色通道的渲染

​​​​​​​offsetoffsetfactor , offsetunits:設定深度偏移

​​​​​​​separatespecularon | off:開啟或關閉頂點光照相關的平行高光顏色

colormaterialambientanddiffuse | emissio:當計算頂點光照時使用每頂點的顏色

unityshader內建函式

transform_tex(tex,name)這個方法的定義在unitycg.cginc中,它有兩個引數,tex.xy是頂點的uv值,name##_st則是在這個shader所在的材質球中,紋理的縮放和偏移,s指scale,t指transform,它是乙個float4型別,其值分別為(tiling.x,tiling.y,offset.x,offset.y)。這個方法運算後,得到的是經過偏移和縮放的uv。它的運算公式是texturecoordinate = tex.xy * name##_st.xy + name##_st.zw。如果偏移為0,縮放為預設1,則可以不用經過這個過程。

unpacknormal(fixed4 packednormal)對法線紋理進行取樣。以unpacknormal方法來說,它最主要的也就是packednormal.xyz * 2 – 1,要解釋這個,就必須講到法線紋理的生成。法線紋理是把模型的法線資訊存到中去,每條法線的x,y,z對應的存到每個畫素的r,g,b中。每條法線裡的每個數值都是乙個[-1,1]的閉合區間裡,畫素的每個數值則都是在[0,255]中,(n + vec3(1.0,1.0,1.0)) * (255.0 / 2.0),每個法線向量,經過加上 vec3(1.0,1.0,1.0)。變成[0,2]的閉合區間裡,然後除以2,再乘以255,發現向量,就會轉換成了[0,255]裡的數值。這也是上述那條公式的由來。至於法線紋理如何生成,有興趣的可以詳細了解一下這個演算法,各個軟體的生成演算法不一樣,最終得到的法線紋理也不一樣。但是紋理裡的資料,肯定是符合規範的法線紋理資料,可以在shader中使用。另外乙個方法unpacknormaldxt5nm,則是乙個壓縮法線紋理後的方法。大家都知道,法線是乙個單位向量,也就是它的長度是1,所以只需要知道x,y的數值,是可以計算得到z的數值的,z=1-(x+y)的平方。這樣就可以減少貼

inline fixed3 unpacknormal(fixed4 packednormal)

inline fixed3 unpacknormaldxt5nm (fixed4 packednormal)

圖的大小,減少gpu的資料傳輸量。

unityobjecttoworldnormal(float3 normal):從模型空間到世界空間轉換法線

unityobjecttoworlddir(float3 dir ):normalize(mul((float3x3)_world2object)

,norm); _world2object:

相當於當前世界矩陣的逆矩陣。

luminance(float3 c):實現shader的灰度化,return dot(c,fixed(0.22,0.707,0.071);

Unity Shader常用函式變數

unity matrix mvp 從頂點座標到螢幕座標的矩陣 worldtoobject 世界到自身的矩陣 objecttoworld 自身到世界的矩陣 worldspacelightpos0 光的世界座標 l worldspacelightdir v.vertex 頂點到光源的向量,未歸一化 v ...

Unity Shader常用內建函式

函式 功能示例 abs絕對值 frac 取小數floor 向下取整 ceil 向上取整 max取最大值 min取最小值 pow次方 pow a,3 rcp倒數 expe ne n enexp2 2 n2 n 2nfmod 取餘fmod 5,2 saturate 把值限制在0 1 clamp 把值限制...

Unity Shader常用語句

將模型空間下的頂點轉換到齊次裁剪空間 與mul unity matrix mvp,v.vertex 相等 它屬於 include unitycg.cginc 所以不要忘記新增 cg程式中用來在一張貼圖中對乙個點進行取樣的方法,返回乙個float4,這裡對 maintex在輸入點上進行了取樣,並將其顏...