这是笔者大学的毕业设计,在图形API(Vulkan)上编写了一套实时全局光照明系统。
正文
先看结果:
准确的说,从hrtz完工后,2021年开始,笔者就想从底(指从图形API开始)到顶实现一套全局光照明系统,这个想法一直到21年下半才开始实施。先是磕磕碰碰地重写,外加调研全局光照明方法,到写出MIAW的第一个版本。
总而言之,这个版本基本是C的编码风格,代码结构由于笔者不学无术没有参照开源项目直接开干,简直是一坨。对于这个版本,光照明的实现方式笔者选用了传统的级联VSM阴影贴图加SVOGI。笔者的SVOGI是按照论文加俺寻思写出来的,因此踩坑无数且性能一团糟。
由于笔者在进行工程时还处于边学边写的状态,项目的几乎所有方面都是一团糟:糟糕的代码结构,API使用方式,极其抽象的绘制逻辑、神秘的Octree建造方式和非常鬼畜的线程安排与同步方式一股脑地混在了一起。
然后在RTX2060上只能跑6帧,直接放弃。
从22年中开始,在第一次失败之后,笔者总结了经验,然后重头再来,这次选定的主力技术是ReSTIR相关方法,到了11月,由于性能并不理想,浅尝即止,准备痛改前非,抛弃“一个体系走到黑”的错误的做GI的思想,弄混合GI。
然而一学期的时间由于高强度摸鱼只写出了基础设施和直接光照明和降噪部分。时间来到2023年初,现在的C++ IDE对内存和性能的要求越来越夸张,在19年购入的旗舰级笔记本(i7-1065G7 + 16GDDR4 3200)竟然撑不住笔者用CLion快乐地写代码了,内存吃满后就定时死机,加之笔者在20年挖矿狂潮中当大冤种入手的2060显卡内存故障疑似矿渣,愈加难受,程序带着显驱一起崩溃的时候根本搞不清是程序问题还是显卡问题。
好在笔者在父母慷慨资助下购买了一套神机,笔者自认为基本踩够了坑,也终于进入大学斯四年的最后一个学期,课程寥寥,时间充沛,天时地利人和,是时候写点真正的GI了。
笔者选择的技术栈是Vulkan与C++(当然,不涉及高级用法),除此之外还有一些外部图像和Json读写库。笔者选择的三维模型存储格式是GLTF2,当然,最终实现出来也只是一个残疾版。
技术上,和许多其他GI方案一样,笔者对光照分类讨论:
- Manylights直接光采样与修改版SVGF处理直接光照。
- Surfel GI缓存间接光照,这与寒霜4的方法类似。
- 屏幕空间光追协助间接光照渲染。
最终效果似乎还行,但还是远达不到笔者的期望。不过藉此,笔者完全重写了渲染基础设施,进一步提升了工程代码能力。笔者也部分理解并激进地实践了GPU Driven Rendering。笔者也在这一版本的MIAW中全盘使用了NVIDIA的Mesh Shader Pipeline(虽然测试场景中的几何体数量都很少),在性能优化中,对GPU性能与性能表现的直觉也变得更加准确了。
本项目的源代码在Gitee上开源,更详细的技术思路和评测与思考已经附在笔者的毕业论文中。
最后,笔者也深深认识到了实时动态场景全局光照明问题的复杂和艰深,不过,既然是问题,那就一定有攻克的方法。
依靠一个人的力量当然不敢妄谈“攻克”,笔者大学的四年也已经结束。现在,找到了目标,那就是时候和更多的同志们一起走上真正的科研道路了,突破没有偶然,合抱之木始于毫末,万丈高楼起于垒土。读书十七年,笔者终于有能力去触摸那时代科技前沿中的一个小小的分支上不断生长的尖端。在这伟大的过程之中,只要参与,哪怕只是一只为大厦搬运灰尘的蚂蚁,也无悔此行。