半调网点和 Bayer 抖动怎么选?用同一张灰阶图看差别
两种方法都用有限的墨色模拟连续明暗,但控制方式不同。半调改变固定格子内圆点的面积;Bayer 抖动把每个位置的亮度与阈值矩阵比较。放大后,前者是大小变化的圆点,后者是规则像素图案,其疏密随亮度变化。
先固定问题
两种方法都想用有限的墨色表达连续明暗,但控制量不同。半调在固定格子里改变圆点面积;Bayer 抖动用固定阈值矩阵决定每个位置是黑还是白。放大画面后,前者是一颗颗大小不同的点,后者是密度变化的规则像素。
关键代码
float darkness=1.0-luminance;
float dotRadius=sqrt(darkness)*0.5;
float halftone=step(length(cellUV-0.5),dotRadius);
// bayerThreshold is a fixed [0,1] value from a 4x4 matrix.
float dither=step(bayerThreshold,luminance);
按顺序验证
对同一张测试图分别打开两种效果,先匹配输出黑白含义,再比较渐变和小字。半调半径用平方根是因为圆面积与半径平方成正比。
适用范围和常见错误
直接把亮度当半径会造成整体明暗偏差。有序抖动会产生可见周期图案;它不是蓝噪声,也不等同于误差扩散。