fwidth、dFdx/dFdy、ddx/ddy

1,049 阅读1分钟

fwidth、dFdx/dFdy 是 GLSL 中的函数方法,ddx/ddy 是 HLSL 中的方法,他们都是用于计算变量基于屏幕像素变化率的方法。

关于 fwidth、dFdx/dFdy

  • dFdx(v) = 该像素点右边的v值 - 该像素点的v值 // v 可以是任意值
  • dFdy(v) = 该像素点下面的v值 - 该像素点的v值
  • fwidth(v) = abs( dFdx(v) + dFdy(v))
  • fwidth、dFdx/dFdy 只在片元着色中可以使用
  • fwidth、dFdx/dFdy 计算的是逐像素的变量差值,而不是逐片元
    • fwidth、dFdx/dFdy 接收什么类型的参数,返回值就是什么类型的参数
  • fwidth、dFdx/dFdy 参数可以是任意参数,但应该是从顶点着色器中传递的参数(varying)
    • 假如传入的参数为一个固定的值,那么像素差值为 “0”,因为所有像素输出的值都一样
float d = dFdx(float(1.0));					// d == float(0.0);
vec2 d = dFdx(vec2(2.0, 3.0));			// d == vec2(0.0, 0.0);
vec3 d = dFdy(vec3(1.0, 2.0, 3.0)); // d == vec3(0.0, 0.0, 0.0);
  • fwidth、dFdx/dFdy 在 webgl1 中需要使用扩展才能使用,在 webgl2 中已经默认支持
 #ifdef GL_OES_standard_derivatives
   #extension GL_OES_standard_derivatives : enable
 #endif

计算逐像素法线(计算当前面法线)

varying vec3 pos;


vec3 normal = normalize(  cross(dFdx(pos),  dFdy(pos))  );

用于判断 Mipmap (贴图 LOD)