(格式未完成)
最近用到了一些WebGl中的一些计算方法, 顺便码一下GLSL相关的所有内置函数, 自从有了gpu计算, 妈妈再也不会担心web前端计算又卡又慢拉!
1. 角度和三角函数:
此类函数中, 如果参数为矢量, 就是对矢量的每个分量进行运算
- radians(degree): 将角度值转化为弧度值
参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- degrees(radian): 将弧度值转化为角度值
参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- sin(angle): 正弦三角函数, 参数使用弧度
参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- cos(angle): 余弦三角函数, 参数使用弧度
参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- tan(angle): 正切三角函数, 参数使用弧度
参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- asin(x): 反正弦三角函数, 返回值为弧度, 在[-π/2, π/2]
参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- acos(x): 反余弦三角函数, 返回值为弧度, 在[-π/2, π/2]区间
参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- atan(y, x): 反正切三角函数, 返回值为弧度, 正切值为y/x, x和y的符号决定处于哪个象限中, 返回值在[-π, π]区间.
参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
- atan(x): 反正切三角函数, 返回值为弧度, 在[-π, π]区间
参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
2. 指数对数函数:
此类函数中, 如果参数为矢量, 就是对矢量的每个分量进行运算.
pow(x, y)
: 返回x
的y
次幂.如果x < 0
, 返回未定义值;如果x = 0
而y < 0
, 返回未定义值参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.exp(x)
: 返回x
的自然指数幂参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.log(x)
: 返回x
的自然对数, 如果x < 0
, 返回未定义值参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.exp2(x)
: 返回2的x幂参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.log2(x)
: 返回以2
为底的x
的对数, 如果x <= 0
, 返回未定义值参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.sqrt(x)
: 返回x
的平方根, 如果x < 0
, 返回未定义值参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.inversesqrt(x)
: 返回x
的平方根的倒数, 如果x < 0
, 返回未定义值参数可以为
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
3. 通用函数:
此类函数中, 如果参数为矢量, 就是对矢量的每个分量进行运算.
abs(x)
: 返回x
的无符号绝对值
参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
sign(x)
: 返回x的符号, 即如果x>0
返回1.0
, 如果x = 0
返回0.0
, 否则返回-1.0
参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
floor(x)
: 返回小于等于x
且最接近x
的整数
参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
ceil(x)
: 返回大于等于x
且最接近x
的整数
参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
fract(x)
: 返回x
的小数部分, 即返回x-floor(x)
参数可以使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数数据类型相一致.
mod(x, y)
: 返回x
除以y
的余数, 即(x-y*floor(x/y))
参数可以都使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与x
的数据类型相一致.
当x的数据类型为 vec2
、 vec3
、 vec4
时, y
的数据类型可以为 float
.
min(x, y)
: 返回x
和y
的最小值, 即y < x
则返回y
, 否则返回x
参数可以都使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与x
的数据类型相一致.
当x的数据类型为 vec2
、 vec3
、 vec4
时, y
的数据类型可以为 float
.
max(x, y)
: 返回x
和y
的最大值, 即x < y
则返回y
, 否则返回x
参数可以都使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与x
的数据类型相一致.
当x的数据类型为 vec2
、 vec3
、 vec4
时, y
的数据类型可以为 float
.
clamp(x, minVal, maxVal)
: 将x
限制在min
和max
之间, 即min(max(x, minVal), maxVal)
参数可以都使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与x
的数据类型相一致.
当x的数据类型为 vec2
、 vec3
、 vec4
时, minVal
和 maxVal
的数据类型可以都为 float
.
10. mix(x, y, a)
: 返回 x
和 y
的线性混合, 即x*(1-a)+y*a
参数可以都使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数x的数据类型相一致.
当x的数据类型为 vec2
、 vec3
、 vec4
时, y的数据类型或a的数据类型可以有一种为 float
.
11. step(edge, x)
: 根据两个数值生成阶梯函数, 即如果x < edge则返回0.0, 否则返回1.0
参数可以都使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与x的数据类型相一致.
当x的数据类型为 vec2
、 vec3
、 vec4
时, edge的数据类型可以为 float
.
12. smoothstep(edge0, edge1, x)
: 经过Hermite插值的阶梯函数.如果x <= edge0
则返回0.0, 如果x >= edge1
则返回1, 否则按如下方法插值出一个值
t= clamp((x-edge0)/(edge1-edge0), 0, 1);
return tt(3-2*t);
参数可以都使用
float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数的数据类型相一致.
4. 几何函数:
length(x)
: 返回矢量x的长度
参数可以使用float
、vec2
、vec3
、vec4
类型数据, 函数返回值为float
类型.distance(p0, p1)
: 返回p0和p1之间的距离, 即length(p0-p1)
参数可以使用float
、vec2
、vec3
、vec4
类型数据, 函数返回值为float
.dot(x, y)
: 返回x和y的点积, 对vec3
: x[0]*y[0]+x[1]*y[1]+x[2]*y[2] 参数可以使用
float、
vec2、
vec3、
vec4类型数据, 函数返回值为
float` .cross(x, y)
: 返回x和y的叉积
参数和返回值都为vec3
数据类型.normalize(x)
: 对x进行归一化, 保持矢量方向不变但长度为1, 即x/length(x)
参数可以使用float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数的数据类型相一致.faceforward(N, I, Nref)
: 法向矢量反方向, 根据入射矢量I和参考矢量Nref来调整法向矢量.如果dot(Nref, I) <0则返回N, 否则返回-N
参数可以都使用float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数的数据类型相一致.reflect(I, N)
: 计算反射矢量, 入射矢量I, 表面法向矢量N, 返回I-2*dot(N, I)*N, 其中的N必须已归一化
参数可以都使用float
、vec2
、vec3
、vec4
类型数据, 函数返回值与参数的数据类型相一致.refract(I, N, eta)
: 根据入射光和介质特性计算折射现象.入射光方向为I, 表面方向矢量为N, 介质的折射率为eta, 返回被折射后的光线方向: k= 1.0-eta*eta*(1.0-dot(N, I)*dot(N, I)) if(k <0.0) 返回0.0或由0.0组成的对应矢量 入射光矢量I和表面法向矢量N必须已经归一化 参数I和N可以都使用
float、
vec2、
vec3、
vec4类型数据, 函数返回值与这两个参数的数据类型相一致, eta则为
float` .
5. 矩阵函数:
matrixCompMult(x, y)``: 将矩阵x和矩阵y相乘, 即
result[i][j]= x[i][j]*y[i][j]`
参数可以都使用f vec2
、 vec3
、 vec4
类型数据, 函数返回值与参数的数据类型相一致.
6. 矢量函数:
此类函数中, 如果参数为矢量, 就是对矢量的每个分量进行运算.
lessThan(x, y)
: 逐分量比较x <y是否成立
参数可以都使用vec2
、vec3
、vec4
、ivec2
、ivec3
、ivec4
类型数据, 函数返回值为与参数矢量长度相同的bvec矢量, 即bvec2
、bvec3
或bvec4
.lessThanEqual(x, y)
: 逐分量比较x <= y是否成立
参数可以都使用vec2
、vec3
、vec4
、ivec2
、ivec3
、ivec4
类型数据, 函数返回值为与参数矢量长度相同的bvec矢量, 即bvec2
、bvec3
或bvec4
.greaterThan(x, y)
: 逐分量比较x>y是否成立
参数可以都使用vec2
、vec3
、vec4
、ivec2
、ivec3
、ivec4
类型数据, 函数返回值为与参数矢量长度相同的bvec矢量, 即bvec2
、bvec3
或bvec4
.greaterThanEqual(x, y)
: 逐分量比较x>= y是否成立
参数可以都使用vec2
、vec3
、vec4
、ivec2
、ivec3
、ivec4
类型数据, 函数返回值为与参数矢量长度相同的bvec矢量, 即bvec2
、bvec3
或bvec4
.equal(x, y)
: 逐分量比较= = 是否成立
参数可以都使用vec2
、vec3
、vec4
、ivec2
、ivec3
、ivec4
类型数据, 函数返回值为与参数矢量长度相同的bvec矢量, 即bvec2
、bvec3
或bvec4
.notEqual(x, y)
: 逐分量比较!= 是否成立
参数可以都使用vec2
、vec3
、vec4
、ivec2
、ivec3
、ivec4
类型数据, 函数返回值为与参数矢量长度相同的bvec矢量, 即bvec2
、bvec3
或bvec4
.not(x)
: 矢量逐分量的逻辑反运算
参数可以使用bvec2
、bvec3
、bvec4
类型数据, 函数返回值与参数的数据类型一致.any(x)
: 矢量的任一分量为true则返回true
参数可以使用bvec2
、bvec3
、bvec4
类型数据, 函数返回值为bool数据类型.all(x)
: 矢量的所有分量为true则返回true
参数可以使用bvec2
、bvec3
、bvec4
类型数据, 函数返回值为bool数据类型.
7. 纹理查询函数:
texture2D(sampler2D sampler,
vec2coord)
: 使用纹理坐标coord, 从当前绑定到sampler的二维纹理中读取相应的纹理像素.texture2D(sampler2D sampler,
vec2coord,
floatbias)
: 使用纹理坐标coord和偏移bias, 从当前绑定到sampler的二维纹理中读取相应的纹理像素, bias只能在片元着色器中使用表示使用Mip纹理时加在当前lod上的值.texture2DProj(sampler2D sampler,
vec3coord)
: 使用纹理坐标coord, 从当前绑定到sampler的投影纹理中读取相应的纹理像素.texture2DProj(sampler2D sampler,
vec3coord,
floatbias)
: 使用纹理坐标coord和偏移bias, 从当前绑定到sampler的投影纹理中读取相应的纹理像素, bias只能在片元着色器中使用表示使用Mip纹理时加在当前lod上的值.texture2DProj(sampler2D sampler,
vec4coord)
: 使用纹理坐标coord, 从当前绑定到sampler的投影纹理中读取相应的纹理像素, coord的最后1个分量被忽略.texture2DProj(sampler2D sampler,
vec4coord,
floatbias)
: 使用纹理坐标coord和偏移bias, 从当前绑定到sampler的投影纹理中读取相应的纹理像素, coord的最后1个分量被忽略, bias只能在片元着色器中使用表示使用Mip纹理时加在当前lod上的值.texture2DLod(sampler2D sampler,
vec2coord,
floatload)
: 使用纹理坐标coord和lod, 从当前绑定到sampler的二维纹理中读取相应的纹理像素, lod为使用Mip纹理时的序号.texture2DProjLod(sampler2D sampler,
vec3coord,
floatlod)
: 使用纹理坐标coord和lod, 从当前绑定到sampler的投影纹理中读取相应的纹理像素, lod为使用Mip纹理时的序号.texture2DProjLod(sampler2D sampler,
vec4coord,
floatlod)
: 使用纹理坐标coord和lod, 从当前绑定到sampler的投影纹理中读取相应的纹理像素, coord的最后1个分量被忽略, lod为使用Mip纹理时的序号.textureCube(samplerCube sampler,
vec3coord)
: 使用纹理坐标coord, 从当前绑定到sampler的立方体纹理中读取相应的纹理像素.coord的方向可用来指定立方体纹理的表面.textureCube(samplerCube sampler,
vec3coord,
floatbias)
: 使用纹理坐标coord和偏移bias, 从当前绑定到sampler的立方体纹理中读取相应的纹理像素.coord的方向可用来指定立方体纹理的表面, bias只能在片元着色器中使用表示使用Mip纹理时加在当前lod上的值.textureCubeLod(samplerCube sampler,
vec3coord,
floatlod)
: 使用纹理坐标coord和lod, 从当前绑定到sampler的立方体纹理中读取相应的纹理像素.coord的方向可用来指定立方体纹理的表面, lod表示使用Mip纹理的序号.