一些基本的图形学函数

        有些基本的函数在图形学里使用很多,而且很灵活,这里做一个简单的汇总。标注内置的是系统提供的函数,标志自定义的是常见的需要自定义的函数。

        这是汇总的链接:

        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,作用是一样的:a=0时返回x,a=1是返回y,其他时候返回线性插值结果。特别注意虽然插值系数a理论上应该在(0,1)之间,但是这个函数没有做clamp(0,1)处理,需要使用者保证范围合法。比如说当a=-1时,返回值是2x-y,这跟线性插值的目的完全不符了。

inverseLerp(自定义)

        lerp函数的逆函数,给定范围[x,y]和介于[x,y]值之间的value,返回value在[x,y]的线性位置。

float inverseLerp(float x, float y, float value) {
    return (value - x) / (y - x);
}

remap(自定义)

float remap(float x, float a, float b, float c, float d)
{
    return (((x - a) / (b - a)) * (d - c)) + c;
}

         remap作用是将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变大而减弱)。

step(内置)

        step函数是一个开关函数,当x小于给定的edge值时返回0,大于时返回1。

float step(float edge, float x) {
  return x < edge ? 0 : 1;
}

linearstep(自定义)

        linearstep函数也是一个开关函数,与step函数不同的是它是给定一个范围[t1,t2],当x<t1时返回0,x>t2时返回1。当x介于[t1,t2]之间时,返回自变量x的一次线性函数。

        注意linearstep实际上和inverseLerp是一个东西,只是做了clamp(0,1)的处理。

float linearstep(float t1, float t2, float x) {
  return clamp((x - t1) / (t2 - t1), 0.0, 1.0);
}

smoothstep(内置)

        smoothstep也是一个开关函数,同样在[t1,t2]范围内做平滑,与linearstep不同的是它是一个一阶平滑函数,在t1点和t2点的一阶导数都为0,解决了linearstep在边缘点变化不平滑的问题。

float smoothstep(float t1, float t2, float x) {
  x = clamp((x - t1) / (t2 - t1), 0.0, 1.0);
  return x * x * (3 - 2 * x);
}

        可以这么理解:首先它找到x在[t1,t2]的线性位置,如果x小于t1返回0,x大于t2返回1。然后执行三阶多项式平滑函数,关于平滑函数可以参考我之前的文章。像素平滑公式比较_白梦刃的博客-CSDN博客

        注意返回值t位于0~1范围内,一般对返回值的使用方式:

1. (可选)使用线性插值函数lerp/mix,将t映射到目标范围

2. 乘以一个函数值,比如颜色。

        有时输入t1>t2,smoothstep函数值等于1减去原来从0到1的渐变,此时是一个从1到0的反向渐变。

其他

        比如GLSL的取小数函数名称为fract而HLSL为frac,更详细的比较查看:

Mapping between HLSL and GLSL |Anteru's BlogAnteru's blog is a blog about development, software architecture and 3D graphics.https://anteru.net/blog/2016/mapping-between-HLSL-and-GLSL/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值