零基础如何学习计算机图形学?
零基础入门图形学最舒服的姿势就是GAMES的课程了。
pbrt(书)非要说的话是离线渲染入门,不是图形学入门。pbrt(书)对于零基础来说太重了,不好把握重心。从内容上来讲,pbrt(书)没有那么难,只是东西太多,比较散。不推荐直接拿来入门,但是不代表你入门的时候不能看它。你可以每过一段时间翻翻目录,看看你对每一章的认识有没有变化,如果你差不多能明白2-19章大致是要干嘛的了(可能在明白渲染方程之后?),你可以读一下你感兴趣的内容(跳着读)。书里面代码太多,读起来有时候感觉挺割裂的,当然了这其实算是feature。
如果你想入门离线渲染,留给你一个小建议:如果你不是过于执着于一个你自己的渲染器,或者说一个兴趣向的产品,那我不建议你重头写一个离线渲染器(smallpt这种级别不算)。
如果你为了学习,那么教育向挖空填代码的Nori2是一个很好的起点(Nori系实际上有三个,一个EPFL的,一个ETH的,一个Cornell的,Cornell这个是Nori的Java版,名字也改成了Wakame)。另一个教育向的代码是pbrt,Standford是拿它来上课的(当然也有原因是mmp是instructor之一)。
Nori和pbrt相比就是体量小,优点是,你可以比较容易地了解代码的每个部分都是干嘛的,魔改起来需要考虑的东西也少一些。缺点是,支持的东西少,不过为了教育目的其实是足够的,如果你魔改的东西多了,你需要改Nori的一些设计。
那么,用这两个代码做基础的大作业区别在哪,用Nori你努努力能在部分方面达到pbrt("复制"pbrt内容),再努努努努力能在部分方面超过pbrt(复现论文),其实不如直接在pbrt基础上加东西,能够集中精力在更有价值的事情上。
所以作为自学来说,推荐你用Nori完成日常作业,然后在pbrt的基础上复现一篇论文作为大作业,虽然Nori切换到pbrt上会需要一点点时间熟悉代码,不过这个难度其实不高。
这里没有提mitsuba,因为mitsuba即使是编译成功就能劝退很多零基础了,而且也不适合学习向。
回到开头,不推荐重头开始写的原因很简单,你如果花别人两倍三倍的时间去完成一件事,对你来说也算是"战略上的懒惰"。你也可以问问你自己,达到pbrt/blender/arnold的真子集和能够实现某个他们不支持的效果,哪个更吸引你。而且有多少人知道pbrt本身是不完善的,是留给书后作业空间的,又有多少人完成过其中一部分。
能够站在巨人的肩膀上是好事,这一次你可以选择依靠他人。(魔改了pbrt它就是你的渲染器了)
我也听别人说过"为了锻炼代码能力"这种理由,其实帮助非常小,而且如果你目的太多了也不好顾全大局。
如果你一定要完全自己写,给一个关于场景文件的建议。我见过包含场景最多的还真是pbrt的,另外有一个单独的pbrt_parser项目,你可以拿来用。mitsuba2有一个mitsuba2-blender项目可以把blender导出mitsuba2格式。Benedikt Bitterli有一些mitsuba格式的场景。usd的场景不是很了解,我也没怎么见过,nvidia好像有一个,usd自己有2个,apple有几个。obj+mtl的场景,Morgan McGuire有一些。luxcore/appleseed也有很多场景,而且他们都是自带blender导出的。总之能用现成的parser尽量就用,实在不行在parser改一点。你也可以自己有个场景文件格式,然后写几个converter把别的格式转过去。祝愿你不要在这种地方浪费太多时间。(wenzel有部分场景是他老婆给他造的,你有吗[狗头保命])