基础函数

GLSL ES 有自身的内置,可以在 Vertex Shader 和 Fragment Shader 中的 main() 函数内进行运算。

下面表格中的这些函数,都可以按照以下格式,即函数的返回值都有float、vec2、vec3、vec4这4种数值类型, 1个参数时对应同种类型,但有2个参数时,其中的第1个必须是同种的,而第2个参数还可以为float。矢量都逐分量运算。 而对于 clamp,mix,step,smoothstep 这些函数另外写出。

float max( float x, float y ) vec2 max( vec2 x, vec2 y ) vec3 max( vec3 x, vec3 y ) vec4 max( vec4 x, vec4 y ) vec2 max( vec2 x, float y ) vec3 max( vec3 x, float y ) vec4 max( vec4 x, float y )
函数 返回值
abs( x ) x的绝对值
sign( x ) x>0返回1.0,x=0返回0.0,x<0返回-1.0
floor( x ) 小于等于x,且最接近x的整数
ceil( x ) 大于等于x,且最接近x的整数
fract( x ) x的小数部分
mode( x, y ) x除以y的余数
max( x, y ) 最大值
min( x, y ) 最小值

clamp:把 x 限制在 minValue 和 maxValue 之间,即小于 minValue 时取 minValue,大于 maxValue 时取 maxValue, 介于两者之间取本来自身的值。数学表达式 min( max(x, minValue), maxValue )。

float clamp( float x, float minValue, float maxValue ) vec2 clamp( vec2 x, vec2 minValue, vec2 maxValue ) vec3 clamp( vec3 x, vec3 minValue, vec3 maxValue ) vec4 clamp( vec4 x, vec4 minValue, vec4 maxValue ) vec2 clamp( vec2 x, float minValue, float maxValue ) vec3 clamp( vec3 x, float minValue, float maxValue ) vec4 clamp( vec4 x, float minValue, float maxValue )

mix:返回 x 和 y 的线性混合,即 x*(1-a) + y*a。

float mix( float x, float y, float a ) vec2 mix( vec2 x, vec2 y, float a ) vec3 mix( vec3 x, vec3 y, float a ) vec4 mix( vec4 x, vec4 y, float a ) vec2 mix( vec2 x, float y, vec2 a ) vec3 mix( vec3 x, float y, vec3 a ) vec4 mix( vec4 x, float y, vec4 a ) vec2 mix( vec2 x, vec2 y, vec2 a ) vec3 mix( vec3 x, vec3 y, vec3 a ) vec4 mix( vec4 x, vec4 y, vec4 a )

step:根据两个数值生成阶梯函数,如果 x < edge 返回0.0, 否则返回1.0

float step( float step, float x ) vec2 step( vec2 step, vec2 x ) vec3 step( vec3 step, vec3 x ) vec4 step( vec4 step, vec4 x ) vec2 step( float step, vec2 x ) vec3 step( float step, vec3 x ) vec4 step( float step, vec4 x )

smoothstep:经过 Hermite 插值的阶梯函数。如果 x ≤ edge0 返回0.0,如果 x ≥ edge1 返回1.0,否则按如下方法插值 t = clamp( (x-edge0)/(edge1-edge0), 0, 1 ) 并返回 t*t*(3-2*t)。

float smoothstep( float step0, float step1, float x ) vec2 smoothstep( vec2 step0, vec2 step1, vec2 x ) vec3 smoothstep( vec3 step0, vec3 step1, vec3 x ) vec4 smoothstep( vec4 step0, vec4 step1, vec4 x )

三角函数,幂、指数、对数函数

下面这些函数,返回值都有float、vec2、vec3、vec4,且参数都是同种类型。矢量都逐分量运算。

函数 返回值
radians( degree ) 角度→弧度,即 π*degree/180
degrees( radian ) 弧度→角度,即 180*radian/π
sin( angle ) 正弦函数,angle为弧度
cos( angle ) 余弦函数,angle为弧度
tan( angle ) 正切函数,angle为弧度
asin( x ) 反正弦函数,返回正弦值为x的弧度,在区间[-π/2, π/2]内
acos( x ) 反余弦函数,返回余弦值为x的弧度,在区间[-π/2, π/2]内
atan( value ) 反正切函数,返回正切值为value的弧度,在区间[-π, π]内
atan( y, x ) 反正切函数,返回正切值为y/x的弧度,在区间[-π, π]内
pow( x, y ) x的y次幂
exp( x ) 自然指数的底 e ≈ 2.71828182845904523536 的x次幂
exp2( x ) 2的x次幂
log( x ) x的自然对数
log2( x ) 以2为底的对数
sqrt( x ) x的平方根
inversesqrt( x ) x的平方根的倒数

矢量函数

以下函数,返回值都是 bvec2、bvec3、bvec4,两个参数都是vec2、vec3、vec4 或 ivec2、ivec3、ivec4,且参数都是同种类型。 矢量都逐分量比较,得出 true / false,再赋值给 bvec2、bvec3、bvec4 对应的元素。

函数 返回值
lessThan( x, y ) 逐分量比较 x < y 是否成立
lessThanEqual( x, y ) 逐分量比较 x ≤ y 是否成立
greaterThan( x, y ) 逐分量比较 x > y 是否成立
greaterThanEqual( x, y ) 逐分量比较 x ≥ y 是否成立
equal( x, y ) 逐分量比较 x == y 是否成立
notEqual( x, y ) 逐分量比较 x != y 是否成立
not( x ) 逐分量的逻辑补运算

这两个函数的返回值是bool,参数则为 bvec2、bvec3、bvec4

函数 返回值
any( x ) 矢量的任意分量为true,返回true
all( x ) 矢量的所有分量为true,返回true

矩阵函数

matrixCompMult( m1, m2 ) 这是特殊的函数,目的是区别于 mat2*mat2,mat3*mat3,mat4*mat4,将两个矩阵的逐元素相乘, 即同行同列的元素相乘。返回值跟两参数都可为 mat2,mat3 和 mat4。

几何函数

下面前3个函数的返回值都是浮点数 float,参数可以是float、vec2、vec3、vec4。

函数 返回值
length( x ) 矢量 x 的长度
distance( p0, p1 ) p0 和 p1 之间的距离
dot( x, y ) x 和 y 的点积(內积)
vec3 cross( vec3 x, vec3 y ) x 和 y 的叉积(外积)

剩下的这些函数,返回值都有float、vec2、vec3、vec4,且参数都是同种类型。

函数 返回值
normalize( x ) 对 x 进行归一化,保持矢量方向不变,长度为1,即 x/length( x )
faceforward( normal, incidence, Nref ) 法向量反向操作,如果 dot( Nref, incidence ) < 0 则返回 N,否则返回 -N
reflect( incidence, normal ) 计算反射矢量,返回 incidence - 2*dot( normal, incidence )*normal
refract( incidence, normal, e ) 根据入射光 incidence 和折射率 e 来计算折射后的光线方向

纹理查询函数

纹理查询函数的返回值都是 vec4,它在 Fragment Shader 中赋值给 gl_FragColor。texture2D 返回的是二维纹素,而 textureCube 则是三维立方体的,它们都是 uniform 变量。带 Proj 的是对于投影版本,纹理坐标从 texCoord 的最后一个分量解析出来,vec4 的 texCoord 的第3个分量将被忽略。 有 bias 参数的只可在片元着色器中使用,表示 sampler 是 MIPMAP 纹理时加上 lod 的值。

vec4 texture2D( sampler2D sampler, vec2 texCoord ) vec4 texture2D( sampler2D sampler, vec2 texCoord, float bias ) vec4 texture2DProj( sampler2D sampler, vec3 texCoord ) vec4 texture2DProj( sampler2D sampler, vec3 texCoord, float bias ) vec4 texture2DProj( sampler2D sampler, vec4 texCoord ) vec4 texture2DProj( sampler2D sampler, vec4 texCoord, float bias ) vec4 texture2DLod( sampler2D sampler, vec2 texCoord, float lod ) vec4 texture2DProjLod( sampler2D sampler, vec3 texCoord, float lod ) vec4 texture2DProjLod( sampler2D sampler, vec4 texCoord, float lod ) vec4 textureCube( samplerCube sampler, vec3 texCoord ) vec4 textureCube( samplerCube sampler, vec3 texCoord, float bias ) vec4 textureCubeLod( samplerCube sampler, vec2 texCoord, float lod )