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 中一个非常常用的函数,它可以方便地获取浮点数的小数部分,从而实现各种数值处理和纹理操作。