Opengl中reflect反射算法

时间:2024-04-08 16:01:00

Opengl中reflect反射算法

在opengl或者其他的游戏引擎shader(比如unity3d中),都有一个方法叫做reflect用来计算光的反射向量,他的参数就是入射光向量和像素法线向量。reflect(R,N)。那么他的内部原理到底是什么呢?
我们先来看下下面这个图片:
Opengl中reflect反射算法
如图所示,L就是入射向量,N就是法线,R就是反射向量,r是R平移到L的箭头上和N构成了一个三角形(向量没有位置,只有方向,所以可以随便平移),l是L平移到R的箭头上和N构成了一个三角形,于是这就构成了一个菱形。
我们根据三角公式:a = |L| cosθ
如果L是单位向量,则a = cosθ
那么菱形的垂直中线长度 t = 2·cosθ
然后我们乘以N的单位向量,把t从标量变成向量
T = 2·cosθ·N
根据向量的特性,r = 2·cosθ·N - L
因为N和L都是单位向量,我们根据向量点积运算:
L·R = |L||R|cosθ
因为单位向量的长度为1,于是整个方程又可以简化为
L·R = cosθ
于是 r = 2·dot(L,R)·N - L
以上便是reflect的运算公式