体积光的绘制
写在前面的话:
这是基于openGL可编程管线的一次绘制实践,具体版本:openGL 3.3。
贴在前面的最终效果图:
对于上述图片的简述:
1. 被光束照到的墙面的漫反射与镜面反射都得到了加强,且被照亮的区域边缘有自然的过渡;
2. 被光束照到的空间里产生了丁达尔现象,而且该圆锥形空间的边际模糊;
3. 光的强度随着投射距离的增大而逐渐变弱。
实现过程
在片段着色器中计算片段、光源两点的连线与聚光灯正射方向之间的夹角α大· 小,设定聚光灯光圆锥体的张角为一个常数Θ,若α大于Θ/2,则不点亮,若小于,则点亮。这样就完成了基本的一个聚光灯的效果。
用两个角度值来表示一个聚光灯的张角:较大的角Θ表示聚光灯能照射到的圆锥体空间的张角,若α大于Θ/2,则不被照亮;较小的角β表示聚光灯能完全照亮的圆锥体空间的张角,若α小于β/2,则光强为一个较大的常数;当α在两角之间,则用一个平滑插值smoothStep函数来计算这些中间区域的光强。这样就完成了一个光亮区域边缘软化的聚光灯效果。
在光束圆锥空间上实时绘制一个半透明的圆锥,这样就可以绘制一个简单的丁达尔现象。
在绘制光束圆锥体的时候将结果绘制到一个独立帧缓存绑定的纹理上去,然后用高斯模糊将其打散,在显示最后结果的纹理上再将打散之后的光束圆