shader内置函数

180 阅读3分钟

shader 有大量的GLSL内置函数,包括:三角函数、指数函数、通用函数、浮点函数、几何函数、矩阵函数、矢量关系函数、纹理函数、原子函数、图像函数、插值函数等。

一、三角函数

  • radians(degrees)

把角度转为弧度,转换公式:弧度=(π/180) * degrees

  • degrees(radians)

把弧度转为角度,转换公式:角度(180/π) * radians

  • sin(angle)

正弦函数

  • cos(angle)

余弦函数

  • tan(angle)

正切函数

二、指数函数

  • pow(x, y)

x的y次方,x > 0, y >= 0

  • exp(x)

以e为底的指数函数

  • log(x)

以e为底的对数函数,x > 0

  • sqrt(x)

平方根函数,x >= 0

三、通用函数

  • abs(x)

求绝对值

  • sign(x)

符号函数。x>0时,返回值为1;x<0时,返回值为-1

  • floor(x)

向下取整,返回小于等于x的整数

  • round(x)

近似值取整,返回最接近x的整数,即四舍五入

  • ceil(x)

向上取整,返回大于等于x的整数

  • mod(x, y)

取模函数,返回x - y * (x/y)

  • min(x, y)

求x与y的较小值

  • max(x, y)

求x与y的较大值

  • clamp(x, minVal, maxVal)

求minVal与maxVal之间的数值,即min(max(x, minVal), maxVal)

  • mix(x, y, a)

x与y的混合,即x * (1- a) + y * a

  • step(edge, x)

阶跃函数。当x < edge时返回0,否则返回1

  • smoothstemp(edge0, edge1, x)

平滑阶跃函数。当x <= edge0且x >= edge1时,返回0。否则在[0, 1]区间执行Hermite插值(edge0 < x < edge1)

四、几何函数

  • length(x)

求矢量的长度,sqrt( x0 + x1 + … )

  • distance(p0, p1)

求两点距离,即length(p0 - p1)

  • dot(x, y)

x与y点乘,即x0 · y0 + x1 · y1 + …

  • cross(vec3 x, vec3 y)

求矢量x与y的叉乘,即(x1 · y2 - y1 · x2 , x2 · y0 - y2 · x0 , x0 · y1 - y0 · x1)

  • normalize(x)

归一化操作,即x / length(x)

五、矩阵函数

  • matrixCompMult(mat x, mat y)

矩阵x与y相乘

  • outerProduct(vec3 a, vec3 b)

向量a与b的外积

  • transpose(mat3 m)

矩阵的转置

  • inverse(mat3 m)

矩阵的反转

六、矢量关系函数

  • lessThan(vec x, vec y)

判断矢量x是否小于矢量y,返回bvec矢量

  • greaterThan(vec x, vec y)

判断矢量x是否大于矢量y,返回bvec矢量

  • equal(vec x, vec y)

判断矢量x与矢量y是否相等,返回bvec矢量

  • any(bvec x)

矢量x中任意数值为true,则返回true

  • all(bvec x)

矢量x中所有数值为true,则返回true

七、整数运算函数

  • bitCount(value)

返回二进制value中含有1的个数

  • findLSB(value)

返回二进制value的最低有效位

  • findMSB(value)

返回二进制value的最高有效位

八、纹理函数

  • texture(gsampler2D sampler, vec2 P[,float bias])

使用纹理坐标来查找绑定采样器的纹理

  • textureLod(gsampler2D sampler, vec2 P, float lod)

使用纹理坐标,结合lod(level-of-detail)来查找纹理

  • textureG rad(gsampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy)

使用纹理坐标,结合梯度来查找纹理

九、原子函数

  • atomicAdd(uint mem, uint data)

原子变量加运算

  • atomicAnd(uint mem, uint data)

原子变量逻辑与运算

  • atomicOr(uint mem, uint data)

原子变量逻辑或运算

  • atomicCompSwap(int mem, int compare, int data)

原子变量的比较交换。mem与compare比较,如果两者相等,那么data赋值给mem

十、图像函数

  • imageSize(gimage2D image)

计算图像的大小

  • imageLoad()

加载图像数据

  • imageStore()

存储图像数据

十一、插值函数

  • interpolateAtCentroid(vec3 interpolant)

在质心的位置进行插值

  • interpolateAtSample(vec3 interpolant, int sample)

在指定采样数的位置进行插值

  • interpolateAtOffset(vec3 interpolant, vec3 offset)

在指定偏移量的位置进行插值