概述
从客户端转岗到图形程序已经将近4个月了,从公司自研引擎转到Unity引擎,打开了Unity新世界的大门,学习过程中时不时和同事交流学习上经验,感觉避开了不少弯路。趁这个假期给自己做一个学习回顾梳理下,对其他人的学习说不准也能提供一份参考。
我认为图形学最大的难点在于知识体系广,下至GPU架构上至光影计算,甚至扩展到显卡、图形API的历史,任何一个细节都足以专门出本书。另外一个问题的则是获取资料,原始资料大多来自墙外的英文论文,翻墙+英文属实不是大多数人的学习习惯。关于第一点新手其实需要有一个合适的学习提纲或学习线路,有些文章提到XX宝书,但我觉得这类书不适合新手,看过的人都知道里面枯燥乏味,一般是没有对应到具体要解决的问题,这种方式很容易学偏,浪费时间,效率也低。关于第二点,用百度往往会搜出一大堆二手垃圾资料,这些资料或是直接复制粘贴书上原文,或是讲了半天一个概念定义都讲不清,又或者是中英文差异、API差异等造成的概念不统一。说垃圾文章多,这都还好,重要的是只获取二手甚至多手资料,都是别人消化过的知识,精华和糟粕混在一起,很难分清哪对哪错。
学习图形学最好是有一个由下向上的过程,就是从硬件底层向上到应用层,但不是真的指从硬件底层开始,具体来说我第一个过程是先从图形API开始,是因为图形API相对来说非常接近GPU,与硬件仅仅隔一个驱动层,通过理解API的调用过程来猜硬件背后做了哪些事,它是个什么流程,脑子里形成这种结构才是这个阶段要注意学的,比方说帧缓冲对象这其实就没讲太清楚附件的概念,把帧缓冲想象成结构体,颜色附件就是结构体中一个int[]属性就很好理解了。这个阶段打好基础框架是很重要的,比方说试着自己去推导变换矩阵,去算坐标空间变换,记背函数名没什么用,以后基本用不上。第二个过程需要在具体引擎上实战,由于引擎为了跨平台一般都给API做了不少封装,如果没有上一过程的学习这时候很容易陷入到细节中,例如不理解函数调用时机,开关选项的用途。这个过程关注的点主要就在于实际应用,通过实战来理解通透上个过程的知识,达到能独立编写某个渲染效果测试demo的程度。这两个过程中最合适的教程应当是有手把手的案例的那种,有了一定水平之后再根据喜好扩展方向。
学习过程
下面是我这段时间的学习过程与提纲,只能适合有过客户端经验的初学者,不适合完全没有经验的人。这个过程只能用于满足Unity图形程序入门级别的学习,对于进阶学习或许没有太大帮助。这种方式能以较快的速度,在两到三个月后满足基本工作要求,而且知识路径很稳,不会走偏。大概学完URP后知识体系会比较完善。
1.learnopengl中文教程
第一个过程是opengl,这个过程的重要是要**了解各种缓冲类型、各种贴图、冯氏光照模型、光源类型,要理解几种坐标空间变换过程、几种片段测试原理、裁剪、剔除、混合和阴影原理,**其它高级应用最好也理解一下,理解不了问题也不大,之后可以再补回来。
学习过程中难免会遇见机翻或是一语带过的部分,需要借助其它的知识来源来帮助理解,这里推荐一些常用的链接,按使用频繁度排序,google就不说了必备的。
-
维基百科和OpenGL Wiki
两个权威wiki,搜索概念用的,质量有保证。 -
OpenGL函数API
官方手册,用来查看函数用途及原理。 -
songho的opengl系列教程
这个教程的坐标空间转换章节和FBO章节写得非常详细。 -
微软的开发人员技术文章分享
关于阴影的这一篇文章对优化原理写的很到位。 -
glm源代码
查看矩阵源码,用来辅助理解变换的原理。 -
understanding-the-view-matrix
关于view matrix的所有细节都有讲到。 - glfw官方函数手册
- Anton的opengl教程
2.《unityshader入门精要》中文书籍
第二个过程是Unity引擎,这本是冯乐乐大佬的书,这本书唯一的问题就在于快被Unity的脚步甩远了,目前还能用,待到内置管线淘汰的时候就不好说了。整本书基于内置渲染管线编写,而Unity在2019.3正式发布通用渲染管线(URP),性能上碾压内置渲染管线,现在可能也就写个测试demo用内置管线了。另一问题是伴随内置管线边缘化的cg语言淘汰,尽管cg与hlsl语法几乎一致,但SRP、URP和HDRP的核心库都是hlsl语言,在内置管线淘汰后,cg也就没有半点用武之地了,不过目前cg库还是得看看的,本质是没变的。
这个学习过程中的知识在原理上大多是在learnopengl中学过的,不过Unity将跨平台操作和API调用封装在了shaderlab语法和cginclude函数库中,所以一方面是要理解ShaderLab、熟悉cginclude函数库,理解API在Unity中的封装,另一方面是了解Unity上业内常见渲染效果实现、渲染路径和几种批处理技术,同样的推荐一些Unity资源。
-
Unity官方手册和Unity官方函数API
官方文档。 - UntiyCGInclude函数源码
这个在Unity安装目录Editor\Data\CGIncludes下。 - Cg语言标准库
-
Unity官方论坛
这里有不少Unity用户和Unity官方技术人员回答问题。 -
HLSL语义文档
cg和hlsl没什么区别,所以资料不用太区分。 -
Unity官方Github开源项目和Unity官方Github(Japan)开源项目
后期学习用,这些开源项目都是非常棒的学习资料。 -
wikibooks
有许多shader案例。
3.catlike srp系列教程
可编程渲染管线是非常重要的一环知识,在学习URP之前必须先学SRP,共计12篇文章,不少内容和前面重叠,其实看完前几篇文章掌握概念和使用方法后就可以去看URP官方的示例项目以及源码了。SRP有几个难懂的核心概念CommandBuffer、SRP Batch,教程中没有讲太明白,依然需要其它资料。
- srp包官方文档
- srp官方文档
- srp核心库
这个在项目目录Library/PackageCache/com.unity.render-pipeline.core/ShaderLibrary下,创建srp项目或者导入srp包之后就有了。 - 知乎CommandBuffer一个理解
4.UniversalRenderPipeline(URP)源码
知识体系成型后,看源码就是最直接最合适的学习道路,示例项目在2019.3之后创建时可选URP模板,自动包含源码。URP源码中真正要关注的核心就是渲染循环和ForwardRenderer,理解URP之后项目上的大部分需求就不会完全不懂了。
- URP包官方文档
-
How the Universal Render Pipeline unlocks games for you
官方对URP的视频介绍以及凌霄大佬的翻译 - 官方URP开源项目-BoatAttack
5.UnityChanToonShader(UTS)
UnityJapan在github的卡通渲染开源项目,UTS基本上就是业界最新的卡通渲染实现方案了。最近花了不少时间基于UTS做了一个URP版本的移植,删改了很多代码基本重新从头写了一遍,增加了不少认识。以后可能会写一篇笔记分析核心算法。
之后打算的学习选项
PBR:Unity的Standard材质
GPU架构
NPR
NIVIDIA GPU Gems1-3
叶大的书单
知识框架
整理了这张思维导图,就是纯目录图梳理用的。图中还有些不完善的地方,特别是“光照与阴影”和“后处理”的部分,这两部分细分的话完全可以打开新世界,这里暂且够用,以后再去逐步探索下去。