OpenGL Shader-常用内建函数

961 阅读3分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

内建函数基础

在此之前实现各种效果滤镜时使用过许多glsl内建函数,然而没有系统性介绍和归类内建函数的使用。这里专门来介绍在开发中常用内建函数,能够对内建函数有更深刻的学习和认识。之前也提到过在应用程序中建议尽量使用内建函数而不是使用相同的计算方法,因为内建函数是经过最大优化(部分内建函数会直接操作硬件)。

内建函数归类

角度三角函数

方法说明
genType radians(genType degrees)角度值转换弧度值
genType degree(genType radians)弧度值转换角度值
genType sin(genType angle)返回正弦值。
genType cos(genType angle)返回余弦值。返回值范围为[−1,1]
genType tan(genType angle)返回正切值。
genType asin(genType angle)反正弦函数,输入范围[−1,1],返回[−π/2 ,π/2 ]角度值
genType acos(genType angle)反余切函数,输入范围[-1,1],返回[0,π]角度值
genType atan(genType angle)反正切函数,输入范围[−1,1],返回[−π/2 ,π/2 ]角度值

角度函数比较常见,例如在计算矩阵旋转角度的场景中会有使用到。

mat2 Rat(float angle)
{
    float Hudu = angle * PI / 180.0;
    return mat2(
        cos(Hudu), sin(Hudu),
        -sin(Hudu), cos(Hudu)
    );

}
uv1 = Rat(0.) * uv1;

指数函数

方法说明
genType pow(genType x,genType y)求 x 的 y 次方的值
genType exp(genType x)计算e的x次方的值,e= 2.71828182845904523536
genType log(genType x)计算满足x等于e的y次方的y的值。
genType exp2(genType x)计算2的x次方
genType log2(genType x)计算满足x等于2的y次方的y的值。
genType sqrt(genType angle)计算x的开方。
genType inversesqrt(genType x)计算x的开方之一的值

几何函数

方法说明
float length(genType x)返回向量x的长度
float distance(genType p0, genType p1)计算向量p0和p1之间的距离
float dot(genType x,genType y)向量x,y之间的点积
vec3 cross(vec3 x,vec3 y)向量x,y之间的叉积
genType normalize(genType x)标准化向量,返回一个方向和x相同当长度为1的向量
genType faceforward(genType N,genType l,genType Nref)nref的点积小于0返回N,否则返回-N
genType reflect(genType l,genType N)返回反射向量
genType refract(genType l,genType N,genType eta)返回折射向量

length在前面绘制圆形时是有使用过的。

vec3 sdfCircle(vec2 uv,float r){
    float d = length(uv) - r;
    return d > 0. ? vec3(1.) : vec3(0., 0., 1.); // 大于0超出画圆范围,小于0在画圆范围内
}

distance在噪点函数中也有使用场景。

float gold_noise(in vec2 xy, in float seed)
{
    return fract(tan(distance(xy*PHI, xy)*seed)*xy.x);
}

基础函数

方法说明
genType abs(genType x)x的绝对值
genType sign(genType x)如果x>0,返回1.0;如果x=0,返回0,如果x<0,返回-1.0
genType floor(genType x)返回小于等于x的最大整数值
genType ceil(genType x)返回大于等于x的最小整数值
genType fract(genType x)返回x-floor(x),即返回x的小数部分
genType mod(genType x,genType y)返回x – y * floor (x/y),即求模计算%
genType min(genType x,genType y)返回比较x和y最小值
genType max(genType x,genType y)返回比较x和y最大值
genType clamp(genType x, genType minVal, genType maxVal)clamp实际上是获得三个参数中大小处在中间的那个值。
genType mix(genType x, genType y, genType a)x⋅(1−a)+y⋅a
genType step(genType edge, genType x)如果x < edge,返回0.0,否则返回1.0
genType smoothstep(genType edge0, genType edge1, genType x)如果x <= edge0,返回0.0 ;如果x >= edge1 返回1.0;如果edge0 < x < edge1,则执行0~1之间的平滑埃尔米特差值

结尾

熟悉常用内建的使用可以帮助快速理解一些shader脚本的算法逻辑和实现原理。同时也能帮助我们借助内建函数的力量更高效快速实现期望达到的shader效果。