图形程序学习经历

图形程序学习经历

从客户端到Unity图形程序将近4个月,过程中和同事交流学习经验,避开了不少弯路。做业务也有一段时间了,正好给自己做一个学习回顾,对其他人也能提供一份参考。

概述

在转岗之前,有过一段短暂使用Unity的时间,算是了解过基本操作能做个小游戏的程度,因此这次从公司自研引擎转到使用Unity没花多长时间。

图形学最大的难点我认为是它广大的知识体系,上至光影管线下至GPU架构、显卡、图形API,其中哪一个细节拎出来都足以出书。新手其实只需要有一个合适的学习提纲或线路,来对照自己的学习过程是否走偏。有些文章提到XX宝书或者其它很厚的书,只要啃透就能理解XX,这其实是一种曲线救国,宝书追求正确性往往是枯燥乏味,而且是没有对应到具体要解决的问题,这种方式很容易学偏,浪费时间,效率也低。

另外一个问题的则是学会获取资料,最新的图形学资料都来自墙外的英文论文、手册,尽管翻墙+英文属实不符合大多数人的学习习惯,但用百度着实会搜出一大堆二手资料,这些资料可能是直接复制粘贴不知道哪本书书上的原文,或是自己也未能理清抽象概念的定义,又或者是中英文差异、API差异等造成的概念不统一,信息筛选过程很容易让人心力憔悴。说资料筛选,这都还好,重要的是只通过二手资料学习,精华和糟粕混在一起,反而容易混淆了正确的概念。

因此学习最好是有一个由下向上的过程,一是先从图形API开始,因为图形API相对来说非常接近GPU,与硬件仅仅隔一个驱动层,通过理解API的调用过程来猜硬件背后做了哪些事,它是个什么流程,脑子里形成这种结构才是这个阶段要注意学的,比方说帧缓冲对象附件的概念很抽象,把帧缓冲想象成结构体,颜色附件就是结构体中一个int[]属性就很好理解了。这个阶段打好基础框架是很重要的,试着自己去推导变换矩阵,去算坐标空间变换。二是在具体引擎上实战,Unity为了跨平台给API做了许多封装,如果没有API的理解在这很容易陷到细节中,这个过程关注的点主要就在于实际应用,通过实战来理解通透上个过程的知识,达到能独立编写某个渲染效果测试demo的程度。这两个过程中的教程最好是有详细操作步骤的那种案例,等自己有一定水平之后再根据喜好扩展方向。

学习过程

下面是我的学习过程,不适合完全没有经验的人,而且只能满足Unity图形程序入门级别的学习,对于进阶学习或许没有太大帮助。但这种方式能以较快的速度,在两个月左右基本满足工作要求,而且知识路径很稳,不会走偏。学完URP后大概知识体系就能大致成型。

1.learnopengl中文教程

opengl和d3d基本是相似的,选一个学习即可。 这个过程的重要是要各种缓冲类型、各种贴图、冯氏光照模型、光源类型,几种坐标空间变换过程、几种片段测试原理、裁剪、剔除、混合和阴影原理,后面高级应用也很有用处最好是理解一下,理解不了的地方不要死钻,之后可以再慢慢补回来。

这之中可能需要借助其它的知识来源来帮助理解,推荐一些常用的链接,按使用频繁度排序,google就不说了必备的。学完之后才能开始下一步学习。

1. 维基百科OpenGL Wiki

两个权威wiki,搜索概念用的,质量有保证。

2. OpenGL函数API

官方手册,用来查看函数用途及原理。

3. songho的opengl系列教程

这个教程的坐标空间转换章节和FBO章节写得非常详细。

4. 微软的开发人员技术文章分享

关于阴影的这一篇文章对优化原理写的很到位。

5. glm源代码

查看矩阵源码,用来辅助理解变换的原理。

6. understanding-the-view-matrix

关于view matrix的所有细节都有讲到。

7. glfw官方函数手册

8. Anton的opengl教程

2.《unityshader入门精要》中文书籍

这本书唯一的问题就在于已经被Unity的脚步甩远了,目前还能用,内置渲染管线淘汰的时候就不好说了。整本书基于内置管线编写,Unity在2019.3发布的通用渲染管线(URP)性能上碾压它太多,可能也就美术写个测试demo会用它了。另一问题是cg语言的淘汰,内置管线库由cg编写,尽管cg与hlsl语法几乎一致,但SRP、URP和HDRP核心库还是用hlsl重写了一遍,等于说需要重新熟悉一遍,不过这个问题倒不大。

知识原理大多在learnopengl中学过的,主要是Unity用shaderlab和cginclude函数封装了跨平台操作和API,所以一方面是要理解ShaderLab、API在Unity中的封装,熟悉cginclude函数库,另一方面是了解书上常见渲染效果的实现,有机会的话最好再看看渲染路径和几种批处理技术,同样的推荐一些Unity资源。

1. Unity官方手册Unity官方函数API

官方文档。

2. UntiyCGInclude函数源码

这个在Unity安装目录Editor\Data\CGIncludes下。

3. Cg语言标准库

4. Unity官方论坛

这里有不少Unity用户和Unity官方技术人员回答问题。

5. HLSL语义文档

cg和hlsl没什么区别,所以资料不用太区分。

6. Unity官方Github开源项目Unity官方Github(Japan)开源项目

后期学习用,这些开源项目都是非常棒的学习资料。

7. wikibooks

有许多shader案例。

3.catlike srp系列教程

可编程渲染管线是非常重要的一环知识,在学习URP之前必须先学SRP,共计12篇文章,不少内容和前面重叠,其实看完前几篇文章掌握概念和使用方法后就可以去看URP官方的示例项目以及源码了。SRP有几个难懂的核心概念CommandBuffer、SRP Batch,教程中没有讲太明白,依然需要其它资料。

1. srp包官方文档

2. srp官方文档

3. srp核心库

这个在工程目录Library/PackageCache/com.unity.render-pipeline.core/ShaderLibrary下,创建srp项目或者导入srp包之后就有了。

4. 知乎CommandBuffer一个理解

4.UniversalRenderPipeline(URP)源码

知识体系成型后,看源码就是最直接最合适的学习道路。示例项目在2019.3之后创建时可选URP模板,自动包含源码。

URP源码中真正要关注的核心就是渲染循环和ForwardRenderer,理解URP之后大部分需求就不会完全不懂了。这之后基本就能按自己喜好来学了。

1. URP包官方文档

2. How the Universal Render Pipeline unlocks games for you

官方对URP的视频介绍以及网上大佬的翻译

3. 官方URP开源项目-BoatAttack

5.UnityChanToonShader(UTS)

UnityJapan在github的卡通渲染开源项目,UTS基本上就是业界最新的卡通渲染实现方案了。最近花了不少时间基于UTS做了一个URP版本的移植,删改了很多代码基本重新从头写了一遍,增加了不少认识。

之后打算的学习选项

GPU架构

PBR:Unity的Standard材质

NPAR 大会历届paper

NIVIDIA GPU Gems1-3

叶大的书单

知识框架

整理了这张思维导图,就是纯目录图梳理用的。图中还有些不完善的地方,特别是“光照与阴影”和“后处理”的部分,这两部分细分的话完全可以打开新世界,这里暂且够用,以后再去逐步探索下去。

发布于 05-23

文章被以下专栏收录