GLSL 内置函数
refract()
返回光线进入另一种材质后的折射方向,就像光进入玻璃或水时发生弯折。
函数签名
vec2 refract(vec2 I, vec2 N, float eta)
vec3 refract(vec3 I, vec3 N, float eta)参数
- I
- 入射方向,单位向量,指向表面。
- N
- 表面法线,单位向量。
- eta
- 折射率之比,外部 / 内部。从空气进入玻璃是 1.0 / 1.5。
返回值
折射后的方向;发生全反射时返回零向量。
在线示例
修改右侧代码,左侧预览会实时更新。
工作原理
光从一种材质进入另一种材质时会改变方向。改变多少取决于两种材质折射率之比 eta:
| 从 / 到 | eta |
|---|---|
| 空气进入水 | 1.0 / 1.33 |
| 空气进入玻璃 | 1.0 / 1.5 |
| 玻璃进入空气 | 1.5 / 1.0 |
refract(I, N, eta) 返回新的方向。示例中视线进入一个玻璃球,向中心弯折,再用弯折后的方向偏移背景棋盘格的采样位置。所以球里的棋盘看起来被放大并且上下颠倒。
常见用法
- 玻璃、水和透镜:用折射方向偏移背景的采样位置。
- 光线追踪透明物体:沿折射方向继续在物体内部追踪光线。
常见错误
I和N没有归一化。公式假设它们都是单位向量。eta写反。从空气进入玻璃是1.0 / 1.5,不是1.5。- 忽略全反射。光以很斜的角度从致密材质射出时,
refract返回vec3(0.0),需要检测并改用reflect。