Fwidth()
简介¶
在GLSL中,fwidth()
函数用于计算给定参数的变化率(rate of change),即该参数在x和y方向上的变化量之和的绝对值。
它通常用于
- 计算像素着色器中每个像素的边缘(edge)粗糙度(roughness)
- 计算模型表面法线的扭曲程度
- 常常与计算梯度的函数(如
dFdx()
和dFdy()
)一起使用。
需要注意的是,由于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;
}