在过去几个月熟悉后处理后,作者好奇将新学技术从纯风格化推进到更具功能性的东西。后处理是增强 3D 场景大气和灯光效果的好起点,可实现更逼真和戏剧性的视觉效果,且性能成本与场景复杂度分离。其中,体积光最先吸引作者,可通过体积光线步进实现,结合后处理和光线步进,作者发现新技巧来补充着色器工作等。
坐标系统与变换
3D 场景有多个坐标系统:对象/模型空间、世界空间、视图空间、裁剪空间、归一化设备坐标、屏幕空间。要从屏幕空间(后处理)转换到世界空间(3D 空间)来绘制光线步进光,需用公式转换坐标,还给出了获取世界位置的 GLSL 函数。
第一个光线
构建带有VolumetricLighting
效果的简单场景,包括各种参数如cameraFar
等,通过Effect
类获取深度纹理,用公式计算光线起点、方向等,进行经典体积光线步进循环,最后组合光的积累和输入颜色作为输出颜色。
基于深度的停止
在光线步进时,会超出相机可见范围绘制光,利用深度纹理可计算相机与世界空间中当前片段点的距离,提前停止光线步进,修复了光源透过球体可见的问题。
塑造光线
可利用签名距离函数(SDF)来塑造体积光,如圆柱形状,展示了不同形状的光线示例。
创建场景阴影图
为解决当前体积光不考虑物体阴影的问题,生成场景的阴影图,通过创建专用渲染目标、虚拟相机并渲染场景来获取深度数据,用于在光线步进循环中判断光线是否被遮挡。
计算阴影和遮挡
实现calculateShadow
函数,根据世界空间中的点计算是否在阴影中,先将点坐标转换回屏幕空间,处理边缘情况,再采样阴影图并比较深度,将其作为光线步进循环的跳过条件,以减少不必要的计算。
相位函数和噪声
引入亨尼希-格林斯坦函数进行方向散射,调整光的散射和吸收,添加分形布朗运动(Fractal Brownian Motion)来模拟大气效果的密度变化,使光更逼真。
性能改进
通过引入蓝噪声抖动(Blue Noise Dithering)来减少光线步进循环的性能影响,消除可见的条纹等伪影,同时稍微移动噪声模式以提高输出质量。
应用示例
- 拱门:实现了光线透过拱形门、柱子投下阴影的场景,添加楼梯增加细节,营造出神秘氛围。
- 小行星带:以中心恒星为光源,有两个小行星环,利用体积光增强亮度和阴影效果,调整阴影相机参数以获得最佳效果。
- 多光源和全方位阴影:解决单个光源和单向阴影的限制,通过添加多个光源和使用立方体相机来处理全方位阴影,但目前只是一个技巧性的解决方案。
最后,作者希望文章能激发读者对体积光的实验,未来将探索更多相关概念和技术。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。