posterize
posterize
将一个连续的颜色或数值(如光照强度)量化为有限的几个离散色阶,用于创建“海报化”或“卡通渲染”等非真实感艺术风格。
核心优势
将底层的数学运算 `floor(color * steps) / steps` 抽象为一个意图明确的节点,使开发者能以艺术效果的思路进行思考,并能程序化地、实时地将该风格应用于任何颜色源,且支持动态调整强度。
常见用途
在卡通渲染中,将平滑的光照渐变量化为硬边缘的阶梯状光影。
作为后期处理效果,模拟复古或8-bit游戏画面的有限颜色风格。
在数据可视化中,将连续数据(如海拔)清晰地划分为不同的视觉层级,形成等高线色带图。
对法线向量进行处理,创造出类似低多边形(Low-Poly)着色的刻面感。
如何调整
主要通过调整 `steps` 参数来控制效果。一个较小的值(如 2 或 3)会产生对比强烈的色块化外观;一个中等值(如 5 到 8)会产生经典的海报化效果。将 `steps` 连接到 `timer` 或其他动态节点,可以创建“信号干扰”或画面“劣化”等动态特效。
代码示例
1// 1. 计算一个平滑的光照因子 (0-1)
2const lightFactor = normalWorld.dot( lightDirection ).saturate();
3
4// 2. 核心:将平滑的光照因子量化为离散的阶梯
5const posterizedLight = posterize( lightFactor, posterizeSteps );
6
7// 3. 使用阶梯化的光照结果
8output.color = baseColor.mul( posterizedLight );