487 字
2 分钟
LearnOpenGL·二·光照·2·不同光源
这是对learnopengl的简单笔记。原教程网址:learnopengl。原教程同时涉及图形学的基本理论与opengl API,本文更多关注API,而简化甚至省略了背后的图形学原理性内容。
点光源(光强衰减)
点光源就是前面用一直用的模型,用点点方向向量计算光线向量。
这里加入光强衰减的考量。
认为散发出来的光线能量不变,但能量平均分散在所有光向四面八方铺开的球面上,所以某点的光强和距离的平方成反比。
而一般中仍引入一次项和常数项,即
\begin{equation} F_{att} = \frac{1.0}{K_c + K_l * d + K_q * d^2} \end{equation}
三个K是自己设定的参数,这个参数大多根据大多数物体所处的位置所定,试出来了下面的效果比较好的设定值:
距离 | 常数项 | 一次项 | 二次项 |
---|---|---|---|
7 | 1.0 | 0.7 | 1.8 |
13 | 1.0 | 0.35 | 0.44 |
20 | 1.0 | 0.22 | 0.20 |
32 | 1.0 | 0.14 | 0.07 |
50 | 1.0 | 0.09 | 0.032 |
65 | 1.0 | 0.07 | 0.017 |
100 | 1.0 | 0.045 | 0.0075 |
160 | 1.0 | 0.027 | 0.0028 |
200 | 1.0 | 0.022 | 0.0019 |
325 | 1.0 | 0.014 | 0.0007 |
600 | 1.0 | 0.007 | 0.0002 |
3250 | 1.0 | 0.0014 | 0.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不同光源/