跳转至

Fwidth()

简介

在GLSL中,fwidth()函数用于计算给定参数的变化率(rate of change),即该参数在x和y方向上的变化量之和的绝对值。

它通常用于

  1. 计算像素着色器中每个像素的边缘(edge)粗糙度(roughness)
  2. 计算模型表面法线的扭曲程度
  3. 常常与计算梯度的函数(如dFdx()dFdy())一起使用。
float fwidth(float p)
vec2 fwidth(vec2 p)
vec3 fwidth(vec3 p)
vec4 fwidth(vec4 p)

需要注意的是,由于fwidth()函数会计算出参数在x和y方向上的变化率之和,因此它可能会受到图像的旋转、缩放等操作的影响。因此,在使用fwidth()函数计算纹理坐标的时候,需要对其进行归一化处理。

fwidth()伪代码

float fwidth(float p)
{
    float fx = abs(dFdx(p));
    float fy = abs(dFdy(p));
    return fx + fy;
}

vec2 fwidth(vec2 p)
{
    vec2 fx = abs(dFdx(p));
    vec2 fy = abs(dFdy(p));
    return fx + fy;
}

vec3 fwidth(vec3 p)
{
    vec3 fx = abs(dFdx(p));
    vec3 fy = abs(dFdy(p));
    return fx + fy;
}

vec4 fwidth(vec4 p)
{
    vec4 fx = abs(dFdx(p));
    vec4 fy = abs(dFdy(p));
    return fx + fy;
}