基于GLSL的聚光灯效果的绘制

体积光的绘制

写在前面的话:

这是基于openGL可编程管线的一次绘制实践,具体版本:openGL 3.3。

贴在前面的最终效果图:


对于上述图片的简述:

1. 被光束照到的墙面的漫反射与镜面反射都得到了加强,且被照亮的区域边缘有自然的过渡;
2. 被光束照到的空间里产生了丁达尔现象,而且该圆锥形空间的边际模糊;
3. 光的强度随着投射距离的增大而逐渐变弱。

实现过程

在片段着色器中计算片段、光源两点的连线与聚光灯正射方向之间的夹角α大· 小,设定聚光灯光圆锥体的张角为一个常数Θ,若α大于Θ/2,则不点亮,若小于,则点亮。这样就完成了基本的一个聚光灯的效果。


用两个角度值来表示一个聚光灯的张角:较大的角Θ表示聚光灯能照射到的圆锥体空间的张角,若α大于Θ/2,则不被照亮;较小的角β表示聚光灯能完全照亮的圆锥体空间的张角,若α小于β/2,则光强为一个较大的常数;当α在两角之间,则用一个平滑插值smoothStep函数来计算这些中间区域的光强。这样就完成了一个光亮区域边缘软化的聚光灯效果。


在光束圆锥空间上实时绘制一个半透明的圆锥,这样就可以绘制一个简单的丁达尔现象。


在绘制光束圆锥体的时候将结果绘制到一个独立帧缓存绑定的纹理上去,然后用高斯模糊将其打散,在显示最后结果的纹理上再将打散之后的光束圆锥体画上去,这样就绘制出了一个比较真实的丁达尔现象。(高斯模糊效果可见下图中的红色区域)
基于GLSL的聚光灯效果的绘制_第1张图片


在片段着色器中绘制光束圆锥体时,根据片段与光源的距离去改变该片段的不透明度,在绘制被照亮的物体时,根据片段与光源的距离去改变光照的强度,岂可获得一个光亮有限且随距离柔和递减的光束。


在片段着色器中绘制光束圆锥体时,根据片段的法线方向,去改变不透明度,即可将一个整体的光束打撒成若干束光合成一个圆锥体光束的效果。(这一效果属于参数错误时意外所得)

你可能感兴趣的:(CG)