GLSL fract函数真的是返回小数部分吗

1,409 阅读2分钟

GLSL fract函数真的是返回小数部分吗

在这里插入图片描述

Parameters x specify the value to evaluate.

Description fract() returns the fractional part of x. This is calculated as x - floor(x). 在这里插入图片描述

大致一看,没什么问题,但是仔细看下负数的部分,如果是小数部分,不应该是下面的图像吗?这不坑人的吗。

在这里插入图片描述

分析一下原因:x - floor(x). 如果x= -0.1,那么y=-0.1,但是看图,返回的是0.9. 因为 floor(-0.1) = -1,(floor返回小于等于x且最接近的整数) 所以-0.1 - (-1)= 0.9 这么一算就明白了这个函数的解释有多坑了吧。 简单理解,整数部分取小数,负数部分取小数+1.

说明:我说的负数并不是值x轴的负。而是预计结果的负。

看这个函数:y = fract(sin(2.0*x)); 在这里插入图片描述

y = sin(2.0*x);

在这里插入图片描述

还有记住fract的返回值的值域是0-1

在 GLSL 中,fract 函数用于返回一个浮点数的小数部分,即去除整数部分后的部分。

fract 函数的语法如下:

float fract(float x);

其中,x 为要求小数部分的浮点数。

fract 函数的实现方式有很多种,以下是一种常见的实现方式:

float fract(float x) {
  return x - floor(x);
}

这个实现方式的原理是,通过 floor 函数获取 x 的整数部分,然后用 x 减去整数部分,即可得到小数部分。

下面是一个使用 fract 函数的示例,用于将纹理坐标限制在 [0, 1] 的范围内:

uniform sampler2D texture;

varying vec2 vUv;

void main() {
  // 将纹理坐标限制在 [0, 1] 范围内
  vec2 uv = fract(vUv);

  // 获取纹理颜色
  vec4 color = texture2D(texture, uv);

  // 输出颜色
  gl_FragColor = color;
}

在上述示例中,我们通过 fract 函数将纹理坐标限制在 [0, 1] 的范围内,然后使用 texture2D 函数获取该坐标处的纹理颜色,并将其输出到屏幕上。

总的来说,fract 函数是 GLSL 中一个非常常用的函数,它可以方便地获取浮点数的小数部分,从而实现各种数值处理和纹理操作。