three.js 著色器材質之glsl內建函式

郭先生的部落格發表於2020-08-04

郭先生發現在開始學習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) 返回折射向量

經常用的函式差不多就是這些。還需要我們在實踐中反覆練習,才能使用的得心應手。

轉載請註明地址:郭先生的部落格

 

相關文章