全部专题

半调网点和 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);

按顺序验证

对同一张测试图分别打开两种效果,先匹配输出黑白含义,再比较渐变和小字。半调半径用平方根是因为圆面积与半径平方成正比。

适用范围和常见错误

直接把亮度当半径会造成整体明暗偏差。有序抖动会产生可见周期图案;它不是蓝噪声,也不等同于误差扩散。

继续实验

参考

官方文档

运行相关示例