VCTRenderer 软阴影与间接阴影全解析超越阴影贴图的体素方案【免费下载链接】VCTRendererA real time global illumination solution that achieves glossy surfaces, diffuse reflection, specular reflection, ambient occlusion, indirect shadows, soft shadows, emissive materials and 2-bounce GI. Published here http://ieeexplore.ieee.org/abstract/document/7833375/项目地址: https://gitcode.com/gh_mirrors/vc/VCTRendererVCTRenderer 软阴影与间接阴影的实现源自一套名为「延迟体素着色Deferred Voxel Shading」的实时全局光照方案先将场景体素化再在体素空间完成光照计算与锥追踪从而一次获得软阴影、间接阴影、环境光遮蔽、镜面反射与双次弹射全局光照。相比传统阴影贴图这套体素方案无需为每个光源单独生成深度图就能输出物理上更可信的柔和阴影与间接光照。VCTRenderer 的成果已发表于 IEEE论文编号 7833375在 AMD R9 380 上以 1920×1080 分辨率实现了 30 FPS 以上的实时性能。下面从原理到源码为你完整拆解这套超越阴影贴图的体素方案。阴影贴图的天花板实时阴影为什么需要新思路阴影贴图Shadow Map是过去二十多年游戏引擎的默认选择从光源视角渲染一张深度图再逐像素比较深度判断是否被遮挡。它简单高效但天花板也很明显硬边与锯齿阴影贴图分辨率有限放大后边缘全是锯齿与阴影痤疮Shadow Acne只解决直接遮挡它只能回答这个点是否被光源直接照到完全无法表达间接阴影、颜色溢出Color Bleeding等全局光照现象每个光源都要一张图点光源需要立方体贴图多光源场景内存和渲染开销成倍增长软阴影靠伪装PCF 模糊、VSM 方差阴影等方案本质上是在后处理里糊边缘并不是真实的面积光柔和过渡。VCTRenderer 的做法是釜底抽薪——不再纠结于深度图而是把整个场景存进体素里用体素锥追踪直接求解光照与阴影。这正是它超越阴影贴图的关键所在。VCTRenderer 软阴影与间接阴影的四步核心管线VCTRenderer 的管线由四步构成每一步都对应项目中的独立源码模块步骤做什么对应源码① 体素化把场景的 Albedo、法线、自发光写入 3D 纹理engine/assets/shaders/voxelization.frag、.geom、.vert② 体素光照逐体素计算直接光照与遮挡注入辐射度engine/assets/shaders/inject_radiance.comp③ 各向异性过滤生成 mipmap 级别供锥体采样engine/assets/shaders/aniso_mipmapbase.comp、aniso_mipmapvolume.comp④ 锥追踪合成逐像素锥追踪输出软阴影、间接光照、AOengine/assets/shaders/light_pass.frag其中动态场景的体素更新由engine/assets/shaders/clear_dynamic.comp负责清除上一帧的动态体素静态体素只体素化一次大幅节省开销。体素结构本身以 3D 纹理存储天然支持硬件三线性插值锥体采样时按直径选取对应 mipmap 级别这就是锥能越走越胖、越走越快的原理。软阴影原理单条锥体光线如何生成柔和边缘在light_pass.frag中每种光源都支持三种阴影方法shadowingMethod1走阴影贴图VSM/EVSM、2走锥追踪软阴影、3直接采样体素可见性纹理。核心的软阴影函数就是TraceShadowCone()硬阴影锥体一旦碰到体素立刻返回全黑anisoSample.a EPSILON即退出边缘锐利软阴影不提前退出而是逐段累积遮挡值visibility (1 - visibility) * alpha * k越靠近遮挡物边缘、碰撞次数越多半影区就越大边缘自然柔和。参数coneShadowAperture锥体张角直接控制阴影的软度张角从 1° 增大到 25°阴影会从接近硬边逐步过渡到大面积半影这正是模拟面积光源照射的真实表现。coneShadowTolerance则用于在硬/软阴影之间连续调节。 有趣的是VCTRenderer 在体素光照阶段还提供了一种更廉价的软体素阴影从体素向光源方向投射单条射线每撞到一个体素就累积一次遮挡并按距离衰减ν ν (1-ν)·κ/t。因为穿过几何体边缘的射线碰撞次数更多单条射线也能近似出柔和过渡。间接阴影原理被遮挡体素与色彩能量传递间接阴影是全局光照中最难做对的部分之一物体 A 挡住了射向物体 B 的间接光线B 因此变暗——这需要光照的空间信息而阴影贴图根本无法表达。VCTRenderer 的处理分两个层次体素遮挡在锥追踪之前先用阴影贴图或体素射线检测对每个体素做遮挡判断避免本该很暗的体素向场景贡献虚假辐射度锥追踪累积间接光每个表面点沿法线半球分布 6 个 60° 张角的扩散锥代码中的diffuseConeDirections锥体从前往后做体积累加front-to-back composition一路把遮挡与颜色一起带回来。于是遮挡体背后的区域既没有直接光、也没有间接光形成真实的间接阴影而被红光照射的墙面会把红色染到相邻表面上形成颜色溢出。这也是 VCTRenderer 能达到双次弹射的原因体素光照阶段先算出每个体素的第一反弹间接光各向异性过滤后再在逐像素锥追踪中近似第二反弹层层递进。VCTRenderer 软阴影与阴影贴图对比效果与性能官方 README 提供了一组直观对比左侧是仅直接光照的 Cornell Box右侧叠加间接光照后红、绿墙面的色彩开始相互渗透阴影也明显软化。在 Crytek Sponza 这类高面数场景中间接光照让石墙与旗帜的明暗过渡更均匀、更真实。对比项阴影贴图VSM/EVSMVCTRenderer 锥追踪软阴影依赖后处理模糊边缘仍会渗漏锥张角直接决定半影宽度物理正确间接阴影不支持体素遮挡 锥追踪天然支持点光源/聚光灯需六面深度图开销大同一体素结构直接复用全局光照不参与与 GI 共用一套管线顺带完成性能方面官方在 AMD R9 380 上的实测数据1920×1080含动态体素化Cornell Box 约 27.77 ms、Sibenik 大教堂约 27.02 ms、Crytek Sponza 约 28.57 ms全部稳定在 30 FPS 以上若每 3~5 帧才更新一次动态体素多数场景可直接冲到 60 FPS。效果演示从 Cornell Box 到 Sponza 大场景除了阴影VCTRenderer 的体素方案还顺带完成了环境光遮蔽AO、镜面反射与自发光材质环境光遮蔽复用扩散锥的遮挡累积配合衰减函数1/(1λr)控制遮蔽范围让墙角、拱门内侧出现自然的接触阴影镜面反射沿反射方向发射一个张角由高光指数决定的锥体一次锥追踪即可近似光泽表面的间接镜面反射自发光材质体素化时把 emission 写入体素面光源、霓虹灯在遮挡区域依然发光并作为间接光源照亮周围。这些效果都可以在运行时的 ImGui 面板中切换验证mode0~4 分别对应完整、无 AO、仅直接、仅间接、仅 AO。如何运行 VCTRenderer 体验体素软阴影想亲手验证这套超越阴影贴图的体素方案只需两步获取源码git clone https://gitcode.com/gh_mirrors/vc/VCTRenderer编译运行项目基于 Visual StudioVCTRenderer.sln依赖GLFW、GLEW、Assimp、FreeImage、TBB、GLM 等均已内置在engine/dependencies/与include/、lib/目录直接编译即可。进入场景后在阴影选项面板源码见engine/assets/code/interfaces/shadowing_options.cpp中可以看到完整的阴影参数阴影贴图分辨率32~8192、模糊强度、各向异性过滤、EVSM 指数与光渗漏削减等把光源的shadowingMethod切到锥追踪模式即可实时观察软阴影随张角参数的变化。按Shift F可切换到自由相机模式。更多原理细节可阅读根目录的README.md与论文paper_final.pdf。总结VCTRenderer 用「体素化 锥追踪」这套统一方案把软阴影、间接阴影、环境光遮蔽、镜面反射与双次弹射全局光照整合进同一条实时管线从根本上绕开了阴影贴图在分辨率、光源数量与物理正确性上的瓶颈。对图形学新手来说它是理解体素锥追踪最清晰的参考实现之一对游戏引擎开发者而言其中软阴影与间接阴影的工程细节更是值得直接借鉴的范本。✨【免费下载链接】VCTRendererA real time global illumination solution that achieves glossy surfaces, diffuse reflection, specular reflection, ambient occlusion, indirect shadows, soft shadows, emissive materials and 2-bounce GI. Published here http://ieeexplore.ieee.org/abstract/document/7833375/项目地址: https://gitcode.com/gh_mirrors/vc/VCTRenderer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考