一些基本的图形学函数

        有些基本的函数在图形学里使用很多,而且很灵活,这里做一个简单的汇总。

        这是汇总的链接:

        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变大而减弱)。

猜你喜欢

转载自blog.csdn.net/paserity/article/details/129827356