Shader_Shader中的內建函式010
今天給大家列出來shader中常用的一些函式,函式後面有釋義,大家可以打印出來,或者在寫shader的時候來這篇文章查閱,看看你需要用到哪些。
Cg提供了一系列內建的標準函式。這些函式用於執行數學上的通用計算或通用演算法(紋理對映等), 有些函式直接和 GPU 指令相對應,所以執行效率非常高。
這些函式來源於文件,我為大家篩選出了常用的,去掉了基本用不到的函式。
數學函式:
abs(x)
返回輸入引數的絕對值
-
acos(x)
反餘切函式,輸入引數範圍為[-1,1],返回[0,π]區間的角度值
-
all(x)
如果輸入引數均不為0,則返回 ture;否則返回 flase。&&運算
-
any(x)
輸入引數只要有其中一個不為0,則返回 true。||運算
-
asin(x)
反正弦函式,輸入引數取值區間為[−1,1],返回角度值範圍為[−π/2 ,π/2 ]
-
atan(x)
反正切函式,返回角度值範圍為⎡−π/2 ,π/2⎤
-
atan2(y,x)
計算y/x 的反正切值。實際上和atan(x)函式功能完全一樣,至少輸入引數不同。atan(x) = atan2(x, float(1))
-
ceil(x)
對輸入引數向上取整。例如:ceil(float(1.3)),其返回值為 2.0
-
clamp(x,a,b)
如果x 值小於 a,則返回a;如果 x 值大於 b,返回b;否則,返回 x
-
cos(x)
返回弧度 x 的餘弦值。返回值範圍為[−1,1]
cross(A,B)
返回兩個三元向量的叉積(cross product)。注意,輸入引數必須是三元向量
-
degrees(x)
輸入引數為弧度值(radians),函式將其轉換為角度值(degrees)
-
determinant(m)
計算矩陣的行列式因子
-
dot(A,B)
返回A 和 B的點積(dot product)。引數A 和 B 可以是標量,也可以是向量(輸入引數方面,點積和叉積函式有很大不同)
-
exp(x)
計算ex的值,e= 2.71828182845904523536
-
exp2(x)
計算2x的值
-
floor(x)
對輸入引數向下取整。例如floor(float(1.3)) 返回的值為1.0;但是 floor(float(-1.3))返回的值為-2.0。
-
fmod(x,y)
返回x/y 的餘數。如果 y 為 0,結果不可預料
-
frexp(x, out exp)
將浮點數 x 分解為尾數和指數,即x = m* 2^exp,返回m,並將指數存入 exp 中;如果 x 為 0,則尾數和指數都返回0
-
frac(x)
Returns the fractional portion of a scalar or each vector component
-
isfinite(x)
判斷標量或者向量中的每個資料是否是有限數,如果是返回true;否則返回false;無限的或者非資料(not-a-number NaN)
-
isinf(x)
判斷標量或者向量中的每個資料是否是無限,如果是返回 true;否則返回 false;
-
isnan(x)
判斷標量或者向量中的每個資料是否是非資料(not-a-number NaN),如果是返回true;否則返回false;
-
ldexp(x, n)
計算x∗2n的值
-
lerp(a, b, f)
計算(1−f )∗ + ∗a b f或者a+f ∗ −(b a)的值。即在下限a 和上限 b 之間進行插值,f表示權值。注意,如果 a和 b 是向量,則權值 f必須是標量或者等長的向量。
-
lit(NdotL,NdotH, m)
N表示法向量;L 表示入射光向量;H表示半形向量;m 表示高光係數。函式計算環境光、散射光、鏡面光的貢獻,返回的 4元向量:
1.位表示環境光的貢獻,總是 1.0;
2.位代表鏡面光的貢獻,如果 N •L<0,則為0;否則為 N •L;
3.位代表鏡面光的貢獻,如果N •L<0或者 N •H <0 ,則位 0;否則為(N •H)m;
W位始終位 1.0
-
log(x)
計算ln(x)的值,x必須大於 0
-
log2(x)
計算log(2x)的值,x 必須大於 0
-
log10(x)
計算log10(x)的值,x必須大於 0
-
max(a, b)
比較兩個標量或等長向量元素,返回 大值
-
min(a,b)
比較兩個標量或等長向量元素,返回 小值
step(a, x)
如果 x<a,返回0;否則,返回1。
sqrt(x)
求 x的平方根, x ,x必須大於 0。
tan(x)
輸入引數為弧度,計算正切值
transpose(M)
M 為矩陣,計算其轉置矩陣
幾何函式:
distance( pt1, pt2)
兩點之間的歐幾里德距離(Euclidean distance)
faceforward(N,I,Ng)
如果Ng
I• <0 ,返回N;否則返回-N。
length(v)
返回一個向量的模,即 sqrt(dot(v,v))
normalize( v)
歸一化向量
reflect(I, N)
根據入射光方向向量 I,和頂點法向量N,計算反射光方向向量。其中I和N 必須被歸一化,需要非常注意的是,這個I 是指向頂點的;函式只對三元向量有效。
refract(I,N,eta)
計算折射向量,I為入射光線,N為法向量,eta為折射係數;其中 I 和N必須被歸一化,如果I 和N 之間的夾角太大,則返回(0,0,0),也就是沒有折射光線;I是指向頂點的;函式只對三元向量有效。
modf(x, out ip) |
|
mul(M, N) |
計算兩個矩陣相乘,如果 M 為 AxB 階矩陣,N 為 BxC階矩陣,則返回 AxC 階矩陣。下面兩個函式為其過載函式。 |
mul(M, v) |
計算矩陣和向量相乘 |
mul(v, M) |
計算向量和矩陣相乘 |
noise( x) |
噪聲函式,返回值始終在 0,1 之間;對於同樣的輸入,始終返回相同的值(也就是說,並不是真正意義上的隨機噪聲)。 |
pow(x, y) |
|
radians(x) |
函式將角度值轉換為弧度值 |
round(x) |
Round-to-nearest,或 closest
integer to x 即四捨五入 |
rsqrt(x) |
X 的反平方根,x 必須大於 0 |
saturate(x) |
如果 x 小於 0,返回 0;如果 x 大於 1,返回1;否則,返回 x |
sign(x) |
如果 x 大於 0,返回 1;如果 x 小於 0,返回01;否則返回 0。 |
sin(x) |
輸入引數為弧度,計算正弦值,返回值範圍為[−1,1] |
sincos(float x, out s, out c) |
該函式是同時計算 x 的 sin 值和 cos 值,其中s=sin(x),c=cos(x)。該函式用於“同時需要計算 sin 值和 cos 值的情況”,比分別運算要快很多! |
sinh(x) |
計算雙曲正弦(hyperbolic sine)值。 |
smoothstep(min, max, x) |
值 x 位於 min、max 區間中。如果 x=min,返回 0;如果 x=max,返回 1;如果 x 在兩者之間,按照下列公式返回資料: x−min x−min −2*( )3 +3*( )2 max−min max−min |
step(a, x) |
如果 x<a,返回 0;否則,返回 1。 |
sqrt(x) |
求 x 的平方根, x ,x 必須大於 0。 |
tan(x) |
輸入引數為弧度,計算正切值 |
tanh(x) |
計算雙曲正切值 |
transpose(M) |
M 為矩陣,計算其轉置矩陣 |
幾何函式(Geometric Functions)
Cg 語言標準函式庫中有
3 個幾何函式會經常被使用到,分別是:normalize 函式,對向量進行歸一化;reflect 函式,計算反射光方向向量;refract 函式,計算折射光方向向量。注意:
1 著色程式中的向量 好進行歸一化之後再使用,否則會出現難以預料的錯誤;
2 reflect 函式和 refract 函式都存在以“入射光方向向量”作為輸入引數,注意這兩個函式中使用的入射光方向向量,是從外指向幾何頂點的;平時我們在著色程式中或者在課本上都是將入射光方向向量作為從頂點出發。
函式 |
功能 |
distance( pt1, pt2) |
兩點之間的歐幾里德距離(Euclidean
distance) |
faceforward(N,I,Ng) |
如果Ng I•
< 0 ,返回 N;否則返回-N。 |
length(v) |
返回一個向量的模,即 sqrt(dot(v,v)) |
normalize( v) |
歸一化向量 |
reflect(I, N) |
根據入射光方向向量 I,和頂點法向量 N,計算反射光方向向量。其中 I 和 N 必須被歸一化,需要非常注意的是,這個 I 是指向頂點的;函式只對三元向量有效 |
refract(I,N,eta) |
計算折射向量,I 為入射光線,N 為法向量,eta 為折射係數;其中 I 和 N 必須被歸一化,如果 I 和 N 之間的夾角太大,則返回(0,0,0),也就是沒有折射光線;I 是指向頂點的;函式只對三元向量有效 |
紋理對映函式(Texture Map Functions)
函式 |
tex1D(sampler1D tex, float s) 一維紋理查詢 |
tex1D(sampler1D tex, float s, float dsdx, float dsdy) 使用導數值(derivatives)查詢一維紋理 |
Tex1D(sampler1D tex, float2 sz) 一維紋理查詢,並進行深度值比較 |
Tex1D(sampler1D tex, float2 sz, float dsdx,float dsdy) 使用導數值(derivatives)查詢一維紋理,並進行深度值比較 |
Tex1Dproj(sampler1D tex, float2 sq) 一維投影紋理查詢 |
Tex1Dproj(sampler1D tex, float3 szq) 一維投影紋理查詢,並比較深度值 |
Tex2D(sampler2D tex, float2 s) 二維紋理查詢 |
Tex2D(sampler2D tex, float2 s, float2 dsdx, float2 dsdy) 使用導數值(derivatives)查詢二維紋理 |
Tex2D(sampler2D tex, float3 sz) 二維紋理查詢,並進行深度值比較 |
Tex2D(sampler2D tex, float3 sz, float2 dsdx,float2 dsdy) 使用導數值(derivatives)查詢二維紋理,並進行深度值比較 |
Tex2Dproj(sampler2D tex, float3 sq) 二維投影紋理查詢 |
Tex2Dproj(sampler2D tex, float4 szq) 二維投影紋理查詢,並進行深度值比較 |
texRECT(samplerRECT tex, float2 s) |
texRECT (samplerRECT tex, float2 s, float2 dsdx, float2 dsdy) |
texRECT (samplerRECT tex, float3 sz) |
texRECT (samplerRECT tex, float3 sz, float2 dsdx,float2 dsdy) |
texRECT proj(samplerRECT tex, float3 sq) |
texRECT proj(samplerRECT tex, float3 szq) |
Tex3D(sampler3D tex, float s) 三維紋理查詢 |
Tex3D(sampler3D tex, float3 s, float3 dsdx, float3 dsdy) 結合導數值(derivatives)查詢三維紋理 |
Tex3Dproj(sampler3D tex, float4 szq) 查詢三維投影紋理,並進行深度值比較 |
texCUBE(samplerCUBE tex, float3 s) 查詢立方體紋理 |
texCUBE (samplerCUBE tex, float3 s, float3 dsdx, float3 dsdy) 結合導數值(derivatives)查詢立方體紋理 |
texCUBEproj (samplerCUBE tex, float4 sq) 查詢投影立方體紋理 |
s 象徵一元、二元、三元紋理座標;z 代表使用“深度比較(depth comparison)” 的值;q 表示一個透視值(perspective value,其實就是透視投影后所得到的齊次座標的 後一位),這個值被用來除以紋理座標(S),得到新的紋理座標(已歸一化到 0 和 1 之間)然後用於紋理查詢。
紋理函式非常多,總的來說,按照紋理維數進行分類,即:1D 紋理函式, 2D 紋理函式,3D 紋理函式,已經立方體紋理。需要注意,TexREC 函式查詢的紋理實際上也是二維紋理。 3D 紋理,另一個比較學術化的名稱是“體紋理(Volume Texture)”,體紋理通常用於體繪製,體紋理用於記錄空間中的體細節資料。
還有一類較為特殊的紋理查詢函式以 proj 結尾,主要是針對投影紋理進行查詢。所謂投影紋理是指:將紋理當做一張幻燈片投影到場景中,使用投影紋理技術需要計算投影紋理座標,然後使用投影紋理座標進行查詢。使用投影紋理座標進行查詢的函式就是投影紋理查詢函式。 本質來說,投影紋理查詢函式和普通的紋理查詢函式沒有什麼不同,唯一的區別在於“投影紋理查詢函式使用計算得到的投影紋理座標,並在使用之前會將該投影紋理座標除以透視值”。舉例而言,計算得到的投影紋理座標為 float4 uvproj,使用二維投影紋理查詢函式:
tex2Dproj(texture,uvproj); 等價於按如下方法使用普通二維紋理查詢函式:
float4 uvproj = uvproj/uvproj.q; tex2D(texture,uvproj);
偏導函式(Derivative Functions)
函式 |
功能 |
ddx(a) |
引數 a 對應一個畫素位置,返回該畫素值在 X 軸上的偏導數 |
ddy(a) |
引數 a 對應一個畫素位置,返回該畫素值在 X 軸上的偏導數 |
- 函式 ddx 和 ddy 用於求取相鄰畫素間某屬性的差值;
- 函式 ddx 和 ddy 的輸入引數通常是紋理座標;
- 函式 ddx 和 ddy 返回相鄰畫素鍵的屬性差值;