HrtZ开发记录

内容纲要

这是2021年春季学期图形学课程的大作业工程,主要是用OptiX和NVIDIA的RT核心加速光追,本文主要写一下开发日常,如果对项目技术感兴趣可以看Gitee上的仓库内的报告。

正文

这个项目与KEKE(可可)合作完成,他不仅神还写了最终版工程里绝大部分的CPU代码(真的是超级码王肝帝...),运用强大的工程能力和Python技巧极大地稳固了开发与调试的基础设施。本来这个工程早在三月份就开始了,增添新特性之后修修补补,加之我们主力进攻的San Miguel场景本身有一堆问题,让我们把超过八成的时间都花在了Debug与和玄学斗争之中,速度较慢,不过尽管如此到期末考试前我们还是完成了渲染器主体和大部分功能,已经可以渲染一些好看的图片了。

file
早期的玄学之一,法线分崩离析,后来发现是我在交点解微分的时候解错了...

但我和可可的代码风格有着巨大的不同。我喜欢用cpp封装数据,使用命名空间,面向过程。他喜欢类封装数据和方法,尽可能地使用C++新特性,把模块做成可实例化的对象。然后理所当然地就开始冲突,第一版的程序结构是KEKE完成的,于是我在写功能的时候不断地往他的类里塞static方法和各种助手函数以及神秘的struct,然而过了一段时间我还是受不住了,按照我的风格重构了一版代码,但是没跑起来,最后被我们废弃掉了,开发继续在逐渐垃圾堆化的代码上进行。到了六月份,可可表示他忍不了了!开始一个人重构代码(这时大约有四千行以上),我就摸鱼去了。

然后由于期末来了工程暂停了好久,7月1号期末考试结束时,可可又重构了几千行,CPU部分的代码重构已经接近完成,颓了一天之后就把显卡坞和笔记本都搬到了JeremyGuo和KEKE的寝室里面。KEKE重构代码的过程中干掉了我们之前的一些Bug,但重构到CUDA的渲染代码时由于这部分代码很多都是我写的,逻辑复杂、模块之间高度耦合1(且没加注释),结果是重构的时候有些逻辑和值被改掉了,加以原本的CPU代码和助手函数意义也有变化,导致合并时出现了许多新的Bug,与原本就有的Bug混在一起,变得非常~非常棘手。

file
不知道重构代码时拔掉的香台(上图中的代码片段)是否加剧了这些Bug的产生。

我们接着花了三天时间把原来的GPU代码的完整功能重构到新版本里,并顺便干掉了了一吨Bug,在此期间还出现了各种玄学情况,搞得我们非常痛苦,比如写了个新的物体材质居然导致天空穹挂掉了等等,不一一描述了,反正很痛苦。经常是我上午九点钟醒来,直接去他们寝室写代码,中午吃个饭,写到下午四点钟,这时候KEKE起床了,我们两个一起写代码,不吃晚饭吃零食充饥,一直写到凌晨一点,我回去睡觉,可可继续写。我睡到第二天早上九点钟起床,打开手机一看微信,是昨晚今早KEKE睡前发来的一些他修掉的我写出来的Bug的位置和我们渲染效果的最新截图。然后我又去他们寝室写代码,KEKE在打呼噜,我打开电脑一看,Gitee上的Commit时间都非常阴间,比如这样:

file
这肝...难道真的不会猝死吗...

原本准备从7月4号就开始写材质的,但很快我们就陷入了Debug的无尽深渊之中,Bug一个接一个地出现,而且原来代码的功能还没移植完成,在移植的时候由于一些约定的改变又出现了新的Bug...等等等等,在7月6号终于推导出了一个简洁且不会造成黑边的DOF方法,妙不可言。然后到7月7号,我(以为)将Bug斩尽杀绝了,开始编写材质,并用ImGui编写新的GUI界面2,这个GUI界面是我们两人混合写的,而且赶工期,加之我们截然不同的代码风格,于是理所当然地进入了轮流堆翔的过程,一个cpp一千多行,最终成为了一座屎山。
file
file
改Bug让人日益暴躁,一直到7月9号,我们基本处于两班倒的状况之中——起床,改另一个人新写出来的Bug,然后写新功能,然后测试新功能,然后睡觉,醒来之后,从Gitee上拉一波代码,看看对方的Commit,接着开始改对方新写出来的Bug。

印象比较深刻的是7月7号斩杀了一个导致所有法线向右上方偏移66.75度的远古Bug(之前我们一直带着这个Bug进行开发!天哪!),7月9号早上单杀了一个我搞出来的数学Bug,它会导致所有采样分布函数不对称的材质发生不可预知的错误,一发入魂渲染结果瞬间看起来就很正确了。然后下午做PPT,出去吃鸡腿饭的时候灵光一闪把噪点过多的问题的病根讨论出来了(这个Bug不会出错,但会让收敛变慢几个量级),激动地回宿舍把这个只有两行但鬼畜的Bug剁了,渲染效率获得了质的飞跃,只需1ssp降噪就能直接出图!终于,我们以为完成了一切,并渲染出了我们的PPT封面。
file
开心至极,觉得工程结束了!明天就是DDL,于是和KEKE去家园食堂久违地吃了正餐(之前我们都是靠着零食和囤积在寝室的肉松饼活下来的),回宿舍做完PPT不想码代码了,开始和JeremyGuo颓废群星,可可开始卡常数,结果他卡着卡着又捞上来一个我写出的体积渲染相关的Bug,到凌晨三点钟的时候可可新增了被我们称为 脱轨飞行 的不和GUI同步的渲染模式,似乎把常数卡下来了!结果我去看的时候咱们发现不仅常数卡下来了,正确性也卡没了(焦散消失)!

file
直接打出WHY。

然后我们俩又开始改Bug,发现原来是卡常数的时候把整套NEE逻辑都搞错了,除此之外还有其他神秘的Bug,一起改改改到早上五点没有结果只能回滚。

这时天亮了/捂脸,我回宿舍睡觉,然后十分钟后肝帝KEKE把焦散消失的鬼畜Bug单杀了,帧率在他卡常后翻了三倍。
file
我睡到九点钟自然醒了,不知为何精神抖擞,跑到可可的宿舍发现他正在床上打呼噜,电脑屏幕上还挂着昨晚的IDE。然后用他的电脑对整个渲染器核心代码进行最后检查,再叉掉了两个小Bug。
file
到十二点钟终于封印键盘,这个时候还存在几个已知的问题和几个FIXME标签,但应该不太影响正确性于是不管啦!叫醒KEKE准备下午一点的展示。展示满成功的,除了在脱轨飞行(不为显卡设置内存障碍)模式下莫名其妙地开始闪屏以外没有其它问题,展示完回宿舍开启脱轨飞行结果一点问题都没有,神秘。

至今我们仍未知道我们的Bug里还有多少代码。

仓库在Gitee上开放。


  1. 而且是用我偏爱的风格写的...但...真的不烂!真的不烂!只是有些逻辑有点神秘而已!/捂脸 

  2. 原来我们的用户交互界面是在控制台下写的一个字符界面,要靠输入命令来与程序交互,非常麻烦。 

此条目发表在学习, 小项目, 有趣的作业分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注