有些基本的函数在图形学里使用很多,而且很灵活,这里做一个简单的汇总。
这是汇总的链接:
HLSL:Intrinsic Functions - Win32 apps | Microsoft Learn
GLSL:Built-in Common Functions - GLSL Programming
clamp
float clamp(float x, float min, float max) {
if (x > max) return 1.0;
if (x < min) return 0.0;
return x;
}
clamp函数返回一个介于minVal和maxVal的值,类型可以是标量也可以是向量。常用操作是将值约束到0~1范围内,HLSL也为此提供了saturate函数。
lerp/mix
float lerp(float x, float y, float a) {
return x * (1 − a) + y * a;
}
这个函数在GLSL中叫mix,HLSL中叫lerp,作用是一样的,在x和y之间使用a做线性插值。
smoothstep
float smoothstep(float t1, float t2, float x) {
x = clamp((x - t1) / (t2 - t1), 0.0, 1.0);
return x * x * (3 - 2 * x);
}
smoothstep函数首先将输入参数映射到0~1范围内,然后执行三阶多项式平滑函数。关于平滑函数可以参考我之前的文章像素平滑公式比较_白梦刃的博客-CSDN博客。注意返回的是位于0~1范围内的系数,经常要配合lerp/mix使用。
remap
float remap(float x, float a, float b, float c, float d)
{
return (((x - a) / (b - a)) * (d - c)) + c;
}
这并不是基本函数,但是也非常常见。作用是将x从原来[a, b]范围映射到[c, d]。一般用于在明确自变量范围的情况下映射到[0, 1]。有时也会被用来线性扩大或者缩小,比如生成体积云时:Shader - Shadertoy BETA
假设c=0,d=1,那么可以画出函数:
需要注意两个点,A(a, 0)和B(b, 1),根据这两个点可以很容易知道这个函数的作用。比如上图中b=1, a=-0.4,很显然作用就是对x增加了基础offset=0.4/1.4,同时降低了直线斜率,整体起到了一个扩大的效果(效果随着x变大而减弱)。