Li Jiaheng's blog
487 字
2 分钟
LearnOpenGL·二·光照·2·不同光源
2024-04-23

这是对learnopengl的简单笔记。原教程网址:learnopengl。原教程同时涉及图形学的基本理论与opengl API,本文更多关注API,而简化甚至省略了背后的图形学原理性内容。

点光源(光强衰减)#

点光源就是前面用一直用的模型,用点点方向向量计算光线向量。
这里加入光强衰减的考量。
认为散发出来的光线能量不变,但能量平均分散在所有光向四面八方铺开的球面上,所以某点的光强和距离的平方成反比
而一般中仍引入一次项和常数项,即
\begin{equation} F_{att} = \frac{1.0}{K_c + K_l * d + K_q * d^2} \end{equation}
三个K是自己设定的参数,这个参数大多根据大多数物体所处的位置所定,试出来了下面的效果比较好的设定值:

距离常数项一次项二次项
71.00.71.8
131.00.350.44
201.00.220.20
321.00.140.07
501.00.090.032
651.00.070.017
1001.00.0450.0075
1601.00.0270.0028
2001.00.0220.0019
3251.00.0140.0007
6001.00.0070.0002
32501.00.00140.000007
至少一次项一般都是1.0.

可见这个表非常的“经验”没有规律,所以一般各大引擎中实现光线衰减使用类似纹理的方法实现——用点到光源的距离(的平方)去采样这个衰减纹理中对角线上的值。

平行光#

光线向量确定,一般不会考虑衰减。

聚光#

设定一个角度a,光线方向和圆锥中线夹角大于这个角度的时候没有光。
不应该产生突变,所以应该设置另一个角度b(b<a),夹角小于这个角度的时候强度系数为1,夹角在b-a的时候强度均匀递减,到夹角为a的时候递减到0.

float I = (angle-b)/(a-b);  
I = (I>0) ? I, 1.0;  
I = max(I,0.0); //大于0  

最后算光照(漫反射和镜面反射)的时候给光色×上这个系数 I。

光源类#

封装光源类,方便多光源。

LearnOpenGL·二·光照·2·不同光源
https://namisntimpot.github.io/posts/cg/opengl/二光照2不同光源/
作者
Li Jiaheng
发布于
2024-04-23
许可协议
CC BY-NC-SA 4.0