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)) );