shader学习-数学与光照

3D数学与光照

光的方向
在物理里,常用黄色箭头描述光的入射, ∠ θ ∠\theta θ即为入射角
但在模型计算光照时,光照入射向量会被统一到原点,和法向量的夹角变成 180 ° − ∠ θ 180°-∠\theta 180°θ,不符要求
shader学习-数学与光照

所以使用从顶点指向光源的向量为入射光
c o s ( α ) = v 1 ⃗ ⋅ v 2 ⃗ ∣ v 1 ⃗ ∣ ∣ v 2 ⃗ ∣ cos(\alpha)=\frac{\vec{v_1} \cdot \vec{v_2}}{|\vec{v_1}||\vec{v_2}|} cos(α)=v1 v2 v1 v2 可知,当 α ≥ 90 ° \alpha\geq90° α90°时, v 1 ⃗ ⋅ v 2 ⃗ ≤ 0 \vec{v_1} \cdot \vec{v_2}\leq0 v1 v2 0,此时不受光照影响
再令 v 1 ⃗ 和 v 2 ⃗ \vec{v_1} 和\vec{v_2} v1 v2 转化为单位向量,此时 1 ≥ c o s ( α ) = v 1 ⃗ ⋅ v 2 ⃗ ≥ 0 1\geq cos(\alpha)=\vec{v_1} \cdot \vec{v_2}\geq0 1cos(α)=v1 v2 0。入射角越小,光照越强烈<=>cosα值越大,
shader学习-数学与光照

从向量叉积的左手螺旋法则可知,需要构建正确的法向量需要顺时针旋转的两个向量
如果从一个三角面来看,如果以点A为原点,v1和v2需要顺时针旋转,则点B和点C也需要顺时针方向,所以构建边的顺序需要为AB,AC
shader学习-数学与光照

背面剔除
如图所示,当法向量和相机向量角度大于等于90°时,无论平面受不受光照影响,都不显示。即背面剔除
shader学习-数学与光照

高光反射
如图所示,当光的反射向量和摄像机的方向向量方向相近时,高光强烈
shader学习-数学与光照

计算反射向量:
让L向量从顶点出发。并且N、L都为单位向量
L ⃗ + R ⃗ = 2 C o s ( ∠ N L ) ∗ N ⃗ = 2 L ⃗ ⋅ R ⃗ ∗ N ⃗ \vec L+\vec R=2Cos(∠NL)*\vec N=2\vec L\cdot \vec R*\vec N L +R =2Cos(NL)N =2L R N
R ⃗ = 2 L ⃗ ⋅ R ⃗ ∗ N ⃗ − L ⃗ \vec R=2\vec L\cdot \vec R*\vec N-\vec L R =2L R N L

shader学习-数学与光照

BlinnPhone高光
由于普通的高光需要计算两次点积,使用BlinnPhone可以减少一次点积运算
使用光向量加摄像机向量得到半角向量H
H和N越近,高光越强
shader学习-数学与光照