零基础如何学习计算机图形学？
20年9月入的图形坑，作为一名出道一年半的练习生，虽不能像这个问题下面很多大佬一样从专业的角度给出高屋建瓴的建议，不过也想分享一下自己一路走来总结的一些经验。 先说几句废话。 首先要明确的是，图形学作为计算机领域的一个重要内容，其覆盖范围非常广泛，包括了渲染、几何、仿真、动画、三维重建、虚拟现实、可视化等等一系列的方向。 在入坑图形学之前，我曾以为图形就是渲染，很多初学者或是还未入行的人也都有着同样的想法。个人认为造成这样现象的原因有以下几点： 1.渲染和我们的日常最为贴近，在电影制作、视频剪辑、游戏等等日常生活中能频繁接触到的领域，我们听的最多的词就是渲染，导致大家普遍对渲染熟悉一点。 2.相比于几何、仿真这些方向，渲染入门的门槛会低不少，只要会一些微积分，再懂一点点的线代就能学习，因此也导致渲染方向的从业者众多，影响力自然也大一些。 3.渲染的结果画面表现力强，毕竟渲染就是靠这个吃饭的。相比起来仿真等方向就吃亏很多，经常在知乎上刷到一些论文的视频，一脸懵逼的进来一脸懵逼的出去，看完也没明白厉害在哪里，只有看了文章了解了一面复杂的数学推导，才能说上一声NB。 如果看到这篇回答的人还没有明确具体要入门的方向，我建议多思考一下，未必就非渲染不可。图形学的每一个方向都有其独特的魅力，而且相比于渲染，其他方向亟需解决的问题更多。 话虽如此，我本人其实也只懂一点点的渲染，所以接下来的内容也只是围绕着渲染来说。 首先不推荐的是使用PBRT这本书来入门。并非是这本书写的不好，恰恰相反，理由是这本书写的太好了，哪怕工作多年的引擎开发人员都需要翻看这本书来回顾和学习一下渲染理论。但是作为初学者，我认为更重要的是能在学习的过程中得到正向反馈，能够适时的做出一些成果来激励自己。而一上来就看这本上千页的教程，很容易迷失在细节中，忘记自己最初是想学什么。并且虽然PBRT有开源的全套渲染器代码，但是看完之后也不一定能够自己写出一个简易版来。 同样也不推荐的是看虎书入门，原因同上，个人认为这本书更加适合在看其他教程的时候作为参考来翻阅。 下面说下我个人经历的学习路径。在回答的最后会附上这一年半时间我收藏的一些高质量内容。 1.Games101 这门课有多好多重要无需多说了，高赞的回答里面基本上都提到了这门课。学完这门课对渲染管线就能有一个基础的认知，如果能认真完成作业的话，相当于自己参与实现了一个简易的软光栅渲染器。 这里推荐一下这个专栏，是我看过所有Games101笔记里面写的最好的。有些内容闫令祺老师在课上也只是提了一嘴，里面也都有较为细致的讲解。  2.OpenGL OpenGL虽然因为一些沉重的历史包袱以及一些生态环境原因，近些年来在游戏中使用的越来越少，但作为最经典的图形API之一，还是非常值得学习的。推荐这个教程的原因有以下几点： 1.中文教程。个人认为语言的门槛也是门槛，有一个现成的高质量的中文教程，自然是没有必要去强迫自己去看英文的，尤其是里面涉及到不少专业名词，中文都看得头晕换做英文只会更加难懂。 2.难度合适。如果在Games101出来之前，我觉得直接用这个教程来入门或许就不那么恰当，因为很多渲染的基础理论，都被OpenGL的API封装好了，这个教程里面也没有过多的去讲解背后的原理。但是现在这门课可以十分合适的接在101后面，在学习的过程中可以和101里的内容相互印证。我们能从101里面学到这门教材里面没有提及到的MVP变换、齐次裁剪、抗锯齿等等算法背后的数学理论，也能从这个教材里面接着101学习到阴影计算，延迟渲染，PBR等进阶一点的渲染内容，并且对于渲染管线每个阶段做的事情有着进一步的理解。 不过个人认为这个系列最后几篇文章翻译有不少问题，如果能够坚持学到最后还是建议换回到英文版来看的。  3.RayTracing in One Weekend三部曲。 作者用C++实现了一个简单的光线追踪渲染器，十分小巧，但该有的功能都有。如果说101里面的光线追踪看完还不是很能理解的话，一步步跟着这篇教程就能对光线追踪有进一步的认识。唯一遗憾的是这个系列数学的推导太少了，不过这也是作者本身的意图，刻意的淡去繁杂的数学推导，将重点放在用代码实现上面。如果能够对蒙特卡洛路径追踪讲的更详细一点，并且加上一些重要性采样的话就完美了。  4.Games202 闫令祺老师在GAMES平台上的第二门课，讲的主要是实时渲染领域的一些算法。相比于101，这门课提到的内容难度会高一些，并且里面的算法都比较“新”。这里的“新”未必是时间上的新，不少算法的提出时间都要追溯到10年以前，但这些算法的意义深远，时至今日都被不少游戏引擎广泛使用。  其实学完这些，我觉得已经可以算是入门了。到了这个阶段先不说水平如何，起码眼界已经打开，不再像刚入行时那么迷茫。只要是真的对渲染感兴趣，在学习这几个教程的过程中，一定会对某些内容有着想要深入了解的想法，抑或是中间遇到了一些没有理解的地方，会主动在谷歌知乎等地方搜索相关的材料。而在这个过程中，你会认识到许多大神，也看到了他们文章里提到的众多高深的算法，认识到自己现在现阶段的不足。因此到了这个阶段，接下来要学什么其实已经可以自己决定。 所以除了上面强推的四门教程，其余的内容还是看个人的喜好。这里简单分享一下自己收藏过的其他一些材料： 1.Games104。一门教你自己搭建一个迷你游戏引擎的课程。介绍了现代游戏引擎所涉及的系统架构，技术点，引擎系统相关的知识，目前刚上完第二节课，有兴趣的同学可以看一下。 2. PBRT。非常经典的一本书，被誉为离线渲染的圣经。先前说不建议初学者入门，是因为上来就一头扎进这本书中十分容易被劝退。但是学习完上述的课程后，已经具有了渲染方向的一定基础。尤其是看完Games202后你会发现原来实时渲染中做了许多的近似，而这门书会告诉你，撇开这些近似，从数学的角度出发，一个物理正确的渲染应该是什么样的。 3.RTR4。同样是非常出名的一本书，并且讲的都是实时渲染里面的一些前沿算法。我一直都十分想看这本书但苦于最近事情太多没有时间。网上关于这本书的评价是“绝世武功的目录”，大意是里面总结了各个方向的精华，但是受限于篇幅只是提了个大概。 @毛星云 已故大神在GitHub上总结过这本书涉及到的相关论文QianMo/Real-Time-Rendering-4th-Bibliography-Collection: Real-Time Rendering 4th (RTR4) 参考文献合集典藏。个人建议是按照专题去看，想要深入学习哪个方面就特定的去看该方向的内容，如果抱着全书看完的想法，大概率只是草草的过一遍。 4.GPU Gems系列。此系列包括Gems三本，Pro七本以及Zen两本，大概是一年一本的频率更新，是游戏开发、计算机图形学和渲染领域的业界大牛们优秀经验的分享合辑汇编。与RTR4不同的是，这本书在GPU编程方面也深入讲解了很多。横向来看，每一部书都代表了当年最先进的图形学以及GPU相关的技术，可以了解当年的渲染技术可以达到什么样的水平。纵向来看，你能从中看到每一项渲染技术近十五六年来的进化过程。同样的之前在网上看过别人对GPU Gems系列的一个总结分类，可以当成一个大纲去翻阅。 5. Raytracing Gems系列。是一本专注于光线追踪技术的文章合集，这个系列没有GPU Gems那么悠久的历史，第一本书去年发布的。对于光线追踪感兴趣的可以去自行查阅。我并没有去翻看过，但可以确定的是这同样是一本质量极高的书。 6.图形API。前面说到OpenGL因为一些历史原因，有被DX压一头的趋势，虽然在一些传统的CAD软件中仍是主力，但是未来想进入游戏行业的同学们有精力还是建议另学一门。DX12建议是看龙书，Vulkan则是官方提供了一个Tutorial合集。  7.游戏引擎。UE和Unity是游戏引擎里面无法忽视的两座大山，各有各的优点。无论从业者如何评价这两款引擎，从学习的角度出发我个人更推荐unity。尽管UE有着非常详细全面的官方教程，并且官方还有许多视频教程，但是用UE来开发会陷入其繁复海量的API里面，C++编译时长问题也让人很苦恼，因此不建议初学者使用UE来入门。Unity虽然最近流行的说法是不适合用于开发高品质的端游，但是无论是从编程语言还是引擎设计上来说，对新手都十分友好，可以快速的在上面实现一个想要的效果。这两款引擎的教程和内容在网上都很多，这里就不举例了。不过关于UE之前收藏了一个质量挺高的开源游戏项目，对于那些对自己实力有自信选择硬刚UE的同学可以参考一下。  8.Iq大神的博客，涉及到图形学的很多方向，有着许多文字和视频教程，并且大部分都有着配套的代码，可以跟着大神的脚步自己写出酷炫的Shader。 9. Shadertoy。一个开源的shader网站，可以在上面看到各路大神互相炫技，并且可以学习到很多shader的写法。第一次看的时候完全不敢相信这些是只用shader就可以完成的。 10. GDC。一年一度的游戏开发者大会。，每年都有数万名游戏开发者参加，设计到游戏设计、游戏制作、程序开发等等一系列游戏开发过程中相关环节。在里面你可以看到很多前沿的游戏技术，不止局限于图形领域。看过这个或许你能明白，国内的游戏大厂并非如网上说的那么不思进取，他们其实也做了不少创新。  11. Siggraph Course。Siggraph无需多说，图形学领域的顶会。每年随之一起举行的Siggraph Course也是质量极高，有不少游戏界的大神会在上面分享一些游戏中的图形算法。  12. 其他个人收藏的一些内容： 《Unity Shader精要》作者的个人博客。 毛星云大神以前写的Unity Shader编程笔记，他的Github上有配套的代码。 RTR的官方网站，里面收集了很多图形学相关的资料，以纸质出门的书籍为主。 GTC，里面有不少有关于使用GPU并行计算来优化图形效率的Talk。 看到的一篇质量不错的DX11开发教程，讲解的也比较细致。 Milo大神给出的游戏编程学习路径。 谷歌开发的filament渲染器。 大佬用OpenGL实现了一边上面提到的RayTracing in One Weekend系列。 浙大学长写过的一篇面试指南，里面的内容基本上实习面试的时候都有问到。 知乎上的两个提问，里面有不少大佬给出自己的建议。 图形学领域的一些论文的解析和复现，虽然收藏后一直没有看过，但是对大佬深深的膜拜。 洛城大佬的专栏，我真的十分喜欢他的文字，怎能能把枯燥的图形算法说的这么优雅。 上面两个都是大佬们自己写的游戏/渲染引擎，也分享了开发过程中遇到的许多技术难点。  除了上述列出来的内容以外，还有很多我没有提到或者发现的优质教程。以知乎为例，上面的大神非常多，他们贡献了许多高质量的文章，这里就不一一@了，有兴趣的同学可以直接把我关注列表里的人全关注一遍，再从他们的关注列表中关注一波他们眼里的大神。 最后祝每位即将入图形坑的学弟学妹们生活愉快，学业有成！