refract
refract
根据斯涅尔定律计算光线穿过透明介质后的折射方向,用于创建玻璃、水等扭曲效果。
核心优势
提供了一个物理精确且性能极高的 GPU 内置函数,用于创建逼真的透明材质。其核心参数 `eta`(折射率之比)让开发者能直接控制扭曲程度,兼具真实感与创作灵活性。
常见用途
玻璃与液体材质
热浪与水波特效
模拟钻石等宝石的色散效果
如何调整
通过调整 `eta` 参数来控制扭曲强度:值越接近 1.0,弯曲越小;值越小,效果越强。将几何法线 `N` 替换为法线贴图,可以为表面增加不规则的细节扭曲,如水面波纹。
代码示例
1// 定义折射率之比(例如,从空气到玻璃)
2const eta = float(1.0 / 1.5);
3
4// 获取入射向量 I 和法线向量 N
5const I = positionWorld.sub(cameraPosition).normalize();
6const N = normalWorld.normalize();
7
8// 计算折射向量
9const refractVec = refract(I, N, eta);
10
11// 使用折射向量采样环境贴图,获得扭曲后的颜色
12const refractedColor = envMap.uv(refractVec);