《塑造光:通过后处理和光线步进在 Web 上实现实时体素照明 - Maxime Heckel 的博客》

在过去几个月熟悉后处理后,作者好奇将新学技术从纯风格化推进到更具功能性的东西。后处理是增强 3D 场景大气和灯光效果的好起点,可实现更逼真和戏剧性的视觉效果,且性能成本与场景复杂度分离。其中,体积光最先吸引作者,可通过体积光线步进实现,结合后处理和光线步进,作者发现新技巧来补充着色器工作等。

坐标系统与变换

3D 场景有多个坐标系统:对象/模型空间、世界空间、视图空间、裁剪空间、归一化设备坐标、屏幕空间。要从屏幕空间(后处理)转换到世界空间(3D 空间)来绘制光线步进光,需用公式转换坐标,还给出了获取世界位置的 GLSL 函数。

第一个光线

构建带有VolumetricLighting效果的简单场景,包括各种参数如cameraFar等,通过Effect类获取深度纹理,用公式计算光线起点、方向等,进行经典体积光线步进循环,最后组合光的积累和输入颜色作为输出颜色。

基于深度的停止

在光线步进时,会超出相机可见范围绘制光,利用深度纹理可计算相机与世界空间中当前片段点的距离,提前停止光线步进,修复了光源透过球体可见的问题。

塑造光线

可利用签名距离函数(SDF)来塑造体积光,如圆柱形状,展示了不同形状的光线示例。

创建场景阴影图

为解决当前体积光不考虑物体阴影的问题,生成场景的阴影图,通过创建专用渲染目标、虚拟相机并渲染场景来获取深度数据,用于在光线步进循环中判断光线是否被遮挡。

计算阴影和遮挡

实现calculateShadow函数,根据世界空间中的点计算是否在阴影中,先将点坐标转换回屏幕空间,处理边缘情况,再采样阴影图并比较深度,将其作为光线步进循环的跳过条件,以减少不必要的计算。

相位函数和噪声

引入亨尼希-格林斯坦函数进行方向散射,调整光的散射和吸收,添加分形布朗运动(Fractal Brownian Motion)来模拟大气效果的密度变化,使光更逼真。

性能改进

通过引入蓝噪声抖动(Blue Noise Dithering)来减少光线步进循环的性能影响,消除可见的条纹等伪影,同时稍微移动噪声模式以提高输出质量。

应用示例

  • 拱门:实现了光线透过拱形门、柱子投下阴影的场景,添加楼梯增加细节,营造出神秘氛围。
  • 小行星带:以中心恒星为光源,有两个小行星环,利用体积光增强亮度和阴影效果,调整阴影相机参数以获得最佳效果。
  • 多光源和全方位阴影:解决单个光源和单向阴影的限制,通过添加多个光源和使用立方体相机来处理全方位阴影,但目前只是一个技巧性的解决方案。

最后,作者希望文章能激发读者对体积光的实验,未来将探索更多相关概念和技术。

阅读 8
0 条评论