數學函式
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在輸入點上進行了取樣,並將其顏...