关于实时渲染和图形API的一些学习资料收录
事情的起因是发现很多平台上有人以小半万的高价卖图形API实现简单实时渲染器的入门课程,个人觉得不值,并且和我崇尚开源精神的理念大悖特悖。这里为一些入门的新同学推荐一些真正方便学习入门的、Step By Step的资料收录。一些分析和建议
首先要知道一个实时渲染器,比较典型的是游戏引擎中的那些,是由以下几部分工件组成的:
[*]RHI/HAL(硬件抽象层,对应D3D12和Vulkan这些图形API)
[*]渲染管线/渲染器(算法,统括PBR和后处理等流程)
[*]材质系统(对渲染器调度的一种上层抽象,旨在让人类调参,控制渲染器有序高效地渲染)
[*]场景黑板(和场景信息的桥梁,如果不是游戏项目的话,可能会直接使用fbx之类的通用表示格式)
新人入门,首要关注的是上面标黑的两项。一般来说,无论如何都建议从API起手,因为类比作画,你首先需要学会用笔。笔有很多种,有趁手的也有比较难用的,它们各自存在历史积淀产生的包袱。总体来说常用的有如下几种:
[*]OGL:非常老的API,包袱重。如果想做手机端,可以用GLES,相对来说干净很多;
[*]D3D11:状态API,有非常强大完善的驱动支持,易用并且性能非常高。并且有延迟状态模式,和D3D12很多情况下打的有来有回;
[*]D3D12:命令机式的API,完全异步的操作模式,开始把GPU作为异步硬件的更多细节呈现给程序员,难用;
[*]Vulkan:同上,但是全平台。因为没有D3D那么多的包袱,设计更加符合GPU行为。但加入了很多TBD/TBR概念,且信号量复杂,更加难用;
[*]Unity SRP:资料比较多,HLSL Shader,相对好用;
[*]UE4 RHI:地狱模式,不推荐打工人以外的任何人使用或是学习。
这里列出的几种笔,对于入门选手来说,明智的选取其中一个可以大大降低学习成本。
[*]如果你想首先关注图形算法,实现漂亮的效果:请使用D3D11或者Unity SRP进行入门,这两个API都可以在一周内快速上手。如果你有web和js基础,three.js也是好选择;
[*]如果你关注GPU的执行模式,想深究硬件的调度:请选择Vulkan,次选D3D12。你需要一个月或者更久来摸清楚GPU的套路,并且在这之后仍然需要研读大量的资料来理清驱动和硬件的关系;
上面属于我个人的一些建议,下面一步步地拿出各种资料带你从入门走向深入。包你认真跟完写完可以找到工作,不需要被割5XXX。最好有一定的英文阅读能力,但是在现在,中文资料已经不少,所以我会尽量推荐中文资料来减小理解难度。
看完入门系列可以亲手写出一个不错的渲染器。下面链接转载如果侵犯版权,请立即联系我删除。
入门 - API
在这个阶段你可能没法啃动别人的代码,需要通过阅读一些书籍来跨过第一个门槛。
OGL
虽然OGL是老API,但是它也包含了渲染管线内的完整状态。对于新人了解GPU的几何管线,已经完全足够。
推荐所有人阅读且跟着实现一遍。这本书可以说是实时渲染入门的最佳材料,如果你足够拼的话一周可以跟完。其内容丰富文字扎实,用到例程代码带注释甚至逐句讲解。不用担心包袱重的问题,它专为初学者引入了GLFW等易用辅助库,教程中的代码清晰简洁。
目录清晰明了
看这本书一遍,你会对API、渲染器、场景有基本的认识。如果你是大三学生想找个实习,只要敢说把这本书吃透,请你在今年春招迅速把简历交给我。
D3D11
下面这个教程,原链在油管。
同样非常详细、完整、清晰,教程中引文论据,很有逻辑。并且不是纯文字,符合一些人听课的习惯。
D3D12
推荐通过龙书入门,因为我到现在没能发现比起龙书更加详尽科学的资料了。很多教程/课程,几何管线都讲不明白,更不要提D3D12里面的那些异步信号,资源栅栏乃至资源布局了。
有中文译本,译者很有经验,翻译直接、准确、老辣,在脚注补充了非常大量的信息,并且便宜。
还有 @佛罗伦萨的木笛 木笛聚聚提供的下面的博客资料。点进去通读一番,图文并茂很容易阅读,对新人易迷惑的概念做了加强解释。感受育碧力量!
这里补充一句,D3D12本身存在相当的复杂性和颠覆性,即使是UE4和SRP也都没能很好地对它做出抽象(vk更甚)。这两个引擎都付出了几年的时间,但它们的D3D12后端效率、BUG率以及可维护性依然都是比较差的。
龙书对这些复杂的概念无一不做了过程化的、细致但简明的解释。龙书的三角形demo不拖泥带水也不过分省略。实际生产环境下D3D12各种特性检查和功能层开启的状态下一个三角形可以写两千行以上,但龙书带上窗口创建和timer等也只有小几百行。它是最适合初学者的三角形。
任何号称比此书更简单上手的说法都是不现实的。要想上手没有捷径,请反复读,配合GPU架构反复琢磨,因为从这里开始GPU就是这么复杂。
Vulkan
VulkanTutorial可以带你创建一套完整的光栅化管线流程。评论区带有不少信息,对新手常见的问题覆盖全、表达清楚、起效快,可以自行观看答疑解惑。
它的源码和shader同样是附在网页上的,可以去看。该教程基本上是Step By Step的理念,每多写几行代码都会开一个小节,向你详尽地解释背后发生了什么。
下面 @wicast C 大佬的回答展示了他学习vulkan的路线,留下了大量资料,很有参考价值。
GAMES101/202
没什么好介绍的,业界大牛,公开课,完全免费。和培训机构网课机构孰优孰劣自己判断。
但是如此宝贵的资源烦请仔细阅读,跟着实现。有一些基础会更好让你独立实现。这也是我放在最后的原因。有太多囫囵吞枣看完就投简历,结果一问三不知,只会说自己看了101/202的人了。
入门 - 算法
首先你必须要对高等数学中积分的概念有认知(微分可以暂时不看,因为辐照领域很少再进行向下微分了)。其次你要对线性代数有基本的认知,最好系统地学习一遍。这也是一种劝退,如果你搞不定这两样,烦请做其它内容。渲染,至少是算法并不适合你。
算法的入门,建议对上述的API中至少一个完成了解再进行。算法部分首先要了解最基本的那些光照模型,以及最基本的PBR相关内容。在LearnOpenGL中你都可以学到:
上述内容学完,你已经算是入门了。下面我们会探讨地更深入一些。
更深入地认识API/GPU
如果你和我一样对GPU的深入调度感兴趣,那请你先回过头去完成Vulkan/D3D12的深入学习,当然这个过程中你会学到很多进阶的GPU特性。
首先,如果你是桌面开发者,请通读nv和amd的GPU spec。这不仅可以帮助你学习优化相关内容,更可以辅助你理解驱动和硬件的一些行为模式:
AMD的GPU设计都是开放的,可以在docs下找到rdna架构GPU的硬件设计、完整命令集和指令集。
之后这里推荐的一些资料有:
[*]Vulkan Samples
LunarG的官方例子集,囊括了几乎所有你能想到的GPU通用特性,并且附有一本书来对其中的每个例子进行完全深入的讲解。
[*]DirectX-Graphics-Samples
微软的官方特性集实例,入门三角形后想要尝试新特性者可以读阅的最佳例子。
[*]Awesome D3D12/Vulkan
所有开源界最优秀的D3D12/Vulkan仓库集中在这里,挑选感兴趣的阅读即可。
一些知乎文章也可以辅助理解这些API,同时知乎是个免费开放的平台,大家都欢迎新的活跃者和交流者。
更深入地理解渲染算法
在刚开始探究的阶段,有一些文章的辅助会让你入门更快一些。但是归根结底,转述存在歧义。要想搞清楚某样东西,请回溯到最初的原paper/原实现。例如如果你要研究迪士尼PBR,请务必配备BRDF Viewer,并直接阅读其中的shader:
很多开源渲染器中有非常优秀的算法实现,这里暂时只推荐一个filament:
它的文档是个宝库,看完你就是静态渲染器大师了。
如果你对骨骼动画/毛发模拟什么的感兴趣,可以去看The-Forge里面的例子,点击即可运行,应有尽有:
在这些资料之外,有一些民间的讨论/文章/材料,可以辅助理解,也可以促进交流,加强乐趣。知乎上的一些文章,首先是推荐我的:
推荐我自己的这篇文章,主要是内部引用非常多,资料十足。看完之后对PBR和TAA会有比较好的一个了解。
更加全面的是:
不麦课的麦老师的早期文章,囊括了TAA、VT、地形、GI、Decal、BindlessResources、Indirect Draw / Dispatch。。。。各种后效应有尽有。当然,提到Effect,那么你最不能错过的是蛙蛙的:
实现了绝大部分Deferred流程中常见的现代Effect,并且代码绝对清晰绝对易读,因为它是一个数千行的顺序大函数(我们每天都吐槽,这简直是渲染教学完美范板)。。。。。里面的大部分效果都有对应的文章:
效果非常棒:
总之
看完上面的东西,只能说算是入门水平,我本人也是在专业领域的门槛不远处。看了上面这些东西你也知道,学习图形学,制作渲染器,需要大量科学的、稳健的积累,需要有一颗保持热忱的心。
多交钱并不能快速让你变强,更不要说你的钱换来的例子并不见得比开源社区的优秀。尤其是如果你还在读大学,大家都清楚拿出几千元不是一件容易的事。我也是大学时代自己买各种培训课学习走出来的,花费不在少数。抱着对游戏开发的热忱,从材质着色器到特效到Gameplay我都有尝试过,其中贵且质量好的不在少数(由于此文保证与任何金钱利益无关,我无法在这里推荐出来)。但现在图形API领域,确实没有好的付费中文教程。
我很自信地告诉大家,目前中文社区,我们开源人分享的资料,就是最好的!
这里感谢开源让学习变成一件如此简单开放并且活跃的事情。正因为热爱这个行业,所以我们要站出来为大家带路。对我个人而言,这么多如海的资料,现代甚至次世代的实现,完全没有掏腰包被宰的道理。学习需要的是持之以恒,切忌头脑发热,伤了钱包又伤了感情。 少了 一个史诗级的保姆 文礼 老师 推荐一下我们项目组前3D Lead的blog:Reader Question Answered 1 - Learning D3D12 To读者:如果你想看d3d12或者vk中某一个api的精细入门点解,请在评论区回复投票一个哦。最近可能会抽出时间对票数高的那个写一个阶段式的入门教程!如果你有api的问题也欢迎在评论区留言提问喔。欢迎讨论![抱抱] 推荐一个学习vulkan的好项目:AMD的fidelityFx,可以跟着sssr走一遍,这个项目可以视作是UE4的简化替代版本,更方便一目了然的搞清楚各个render pass是如何互相搭配工作的 再再补充几句
学习FidelityFx的项目,需要:
1.pbr流程的shader : 要看veach 1997论文 chap.4,用有界线性泛函处理render equation的方法非常精彩,里面一个副产品直接解释了为何计算render equation要解无数次积分
3.Sssr流程的shader :这个需要去看EA2015年的ppt
4.Compute shader的语法: 需要微软的spec
5.Sample和denoising : 很新的2篇论文
这个是偏向数学系出身的初学者的学习过程,或者求知欲比较强,不满足只会调用几个API写个sample就满足的人,其中每个过程都可能会被卡住一段时间,整套流程下来大约需要1-2个月的业余时间,基本上看完这些之后现代图形学的一些基石性的知识就算是入门了,在这之上学习API会更加简单一些
麻烦作者帮忙推荐到第一个回复下面,谢啦~ 笔芯 笔芯 笔芯 这波啊,这波是homo对社区的回馈[爱]