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。

相关函数