郭先生發現在開始學習three.js著色器材質時,我們經常會無從下手,辛苦寫下的著色器,也會因莫名的報錯而手足無措。原因是著色器材質它涉及到另一種語言–GLSL,只有懂了這個語言,我們才能更好的寫出著色器材質,利用好的我們的GPU。這篇說一說glsl內建函式。
1. 和角度相關的函式
下面是一個和角度相關的函式,他們的用法我們度熟悉。
函式 | 引數 | 描述 |
---|---|---|
sin(x) | 弧度 | 正弦函式 |
cos(x) | 弧度 | 餘弦函式 |
tan(x) | 弧度 | 正切函式 |
asin(x) | 弧度 | 反正弦函式 |
acos(x) | 弧度 | 反餘弦函式 |
atan(x) | 弧度 | 反正切函式 |
radians(x) | 角度 | 角度轉換為弧度 |
degrees(x) | 弧度 | 弧度轉換為角度 |
2. 數學函式
這類主要是對指數對數冪函式的操作
函式 | 描述 |
---|---|
pow(x,y) | x的y次方。如果x小於0,結果是未定義的。同樣,如果x=0並且y<=0,結果也是未定義的。 |
exp(x) | e的x次方 |
log(x) | 計算滿足x等於e的y次方的y的值。如果x的值小於0,結果是未定義的。 |
exp2(x) | 計算2的x次方 |
log2(x) | 計算滿足x等於2的y次方的y的值。如果x的值小於0,結果是未定義的。 |
sqrt(x) | 計算x的開方。如果x小於0,結果是未定義的。 |
inversesqrt(x) | 計算x的開方之一的值,如果x小於等於0,結果是未定義的。 |
3. 常用函式
這裡是常用函式,和js中的內建函式很像,需要牢記。
函式 | 描述 |
---|---|
abs(x) | 返回x的絕對值 |
sign(x) | 如果x>0,返回1.0;如果x=0,返回0,如果x<0,返回-1.0 |
floor(x) | 返回小於等於x的最大整數值 |
ceil(x) | 返回大於等於x的最小整數值 |
fract(x) | 返回x-floor(x),即返回x的小數部分 |
mod(x, y) | 返回x和y的模 |
min(x, y) | 返回x和y的值較小的那個值。 |
max(x, y) | 返回x和y的值較大的那個值。 |
clamp(x, minVal, maxVal) | 將x值鉗於minVal和maxVal之間,意思就是當x<minVal時返回minVal,當x>maxVal時返回maxVal,當x在minVal和maxVal之間時,返回x |
mix(x, y, a) | 返回線性混合的x和y,如:x*(1−a)+y*a |
step(edge, x) | 如果x < edge,返回0.0,否則返回1.0 |
smoothstep(edge0, edge1, x) | 如果x <= edge0,返回0.0 ;如果x >= edge1 返回1.0;如果edge0 < x < edge1,則執行0~1之間的平滑埃爾米特差值。如果edge0 >= edge1,結果是未定義的。 |
4. 幾何函式
這是與長度、距離、向量等相關的函式
length(x) | 返回向量x的長度 |
distance(p0,p1) | 計算向量p0,p1之間的距離 |
dot | 向量x,y之間的點積 |
cross(x, y) | 向量x,y之間的叉積 |
normalize(x) | 標準化向量,返回一個方向和x相同但長度為1的向量 |
faceforward(N, I, Nref) | 如果Nref和I的點積小於0,返回N;否則,返回-N; |
reflect(I, N) | 返回反射向量 |
refract(I, N, eta) | 返回折射向量 |
經常用的函式差不多就是這些。還需要我們在實踐中反覆練習,才能使用的得心應手。
轉載請註明地址:郭先生的部落格