glsl ddx ddy

1,192 阅读1分钟

基本含义

  • GPU在光栅化的时候一般以2x2的像素块为单位并行执行的。
  • ddx , ddy的计算规则如下图(注: dFdx, dFdy是GLSL里的叫法)
  • ddx,ddy反映了相邻像素在屏幕空间x和y方向上的距离(变化率);
  • fwidth(v) = abs(ddx(v) + ddy(v))
  • fwidth则反映了相邻像素在屏幕空间上的距离差值.
    • 如:fwidth(pos); 相邻像素位置的差值
    • fwidth(normal); 相邻像素法线的差值
    • fwidth(uv); 相邻像素uv的差值

计算Mipmap Level

Level 计算公式:

  • Mipmap Level = log2(ρ)
  • 注:w是3D贴图的第三个坐标轴,对于2D贴图,∂w/∂x和∂w/∂y为0;
  • ∂u/∂x是u对x的偏微分(也就是u沿x轴的变化率),即ddx(u),可以理解成当屏幕像 素沿x轴变换一个单位时,贴图沿u方向变化了几个单位.

边缘处理

  • 让颜色边缘突出:
    • finalColor += (ddx(finalColor ) + ddy(finalColor )) * _Intensity;
    • finalColor += fwidth(finalColor) * _Intensity;

计算表面法线

normal = normalize(cross(ddy(IN.worldPos), ddx(IN.worldPos)));