当前位置:首页>文章 > 

分享我的图形学学习历程

分享我的图形学学习历程

分享我的图形学学习历程

本文核心词:CG

从大三开始接触图形学到现在,已经四年多了。我的职位也经历了算法工程师-前端工程师-无线工程师-游戏引擎程序师的变化。也恰好在这几年,图形学界,大家等到了新的图形API,也见到了VR由盛转衰,手游兴起,国内手游市场从百花齐放到又是只剩几个大佬独大,最火的引擎从cocos2dx变成了unity。短短数年就有如此之大的变化,不得不感慨几句。

17年底,中国游戏收入规模超2000亿,且增长率依旧乐观

我先想提一句,就是现在这个时代,游戏开发所需要的图形学知识,确实是越来越少了。游戏引擎开放,成熟,易用,可靠。unity引擎非常赞,UE4现在势头也非常猛。如果目标是游戏公司客户端开发岗的话,推荐两者至少其一理解一下,不要讨论c#和c++的优劣,反正到时候用的基本是lua。如果目标是游戏开发,那熟练使用引擎,理解业务比钻研图形学收益大得多。

在xlua诞生以前,ulua,slua,nlua这些u3d热更新框架竞争还是很激烈的图形学的一些常见误区

图形学 != DX/OpenGL/etc.

图形学 != 渲染

学好图形学 != 能做游戏引擎

图形学很难

网上有个段子,程序员三大浪漫。虽然这也是轮子哥众多黑历史中的一个,但也证明了计算机图形学有独特魅力 —— 就算是传统软件程序员,也对CG心有向往。

计算机图形学,英文Computer Graphics,简称CG。CG是一个很大的范畴,在国内的话一般是两个大方向——建模和渲染,渲染又分实时渲染和离线渲染。简单来说就是三维世界的描述和展示。

当下,实时渲染最常用的两个API,就是direct3D和openGL了。当然,基于mantle设计的几个新图形API——Metal和vulkan增长也是蛮快的。vulkan在安卓上刚刚起步,有待发展,而Metal在ios上就比重很大了。两三年前做ios可能还要考虑同时支持openGL ES和Metal,现在的话就打Metal包就可以了。ios平台,率先完成了去openGL的大业。

驱动层支持Command Buffer,以及PSO,是mantle高效的重要原因我的图形学学习流程

终于回到标题了,本节分享一下我的图形学学习和演进过程。我自己也是刚入门的鶸,所以走了很多弯路。

API篇:相信有无数人给灌输一个观念,就是API不重要,思想才重要。这个观点没有错误,但是对于新人来说很危险。图形学是个很工程的学科,知其然,然后探其所以然。不至少会用一个三维API就直接看三砖(PBRT,RTR,AGI),绝对是事倍功半的。

webgl —— 我图形学入门真的是靠webgl入门的,看的就是那本《webgl编程指南》。《webgl编程指南》这本书我也推荐所有想入坑图形学的人当做入门起手,这本书讲图形管线非常细致。我从webgl入门其实和我刚上大学时候的,HTML5异军突起,大家都在讲移动应用已死,H5就是未来。想想其实挺幸运,webgl入坑可以绕过openGL对于新人的各种坑——openGL到底是c/c++的库,c/c++的依赖问题对于新人来说都不是个简单的问题。《交互式计算机图形学第7版》把教学语言从openGL改为了webGL,也是基于同样的原因。

openGL 3.3 core —— 接下来就离开浏览器,回归桌面了。learnopengl是我学习openGL 3.3core的主要参考,主要收获是两个,一个是延迟渲染,一个是MRT。

娱乐大师显卡跑分,利用延迟渲染可以支持巨量的动态光源

openGL 4.x—— 主要参考的就是openGL4 shading language cooked第一版第二版两版。我当时的主力开发机是mac,mac只支持openGL 4.1,额外支持openGL 4.2的texstorage。所以mac的话最好两版比照着看,用win和Linux的话直接看第二版就好了。推荐书籍除了之前的还有openGL development cookbook和红宝书第8版(今年第9版汉化也有了),我并没有把红宝书地8版看完,只看了其中的计算着色器部分

vulkan —— 看vulkan主要就算三本书,vulkan programming guide,learning vulkan,vulkan cookbook。那个时候vulkan的窗口封装库,比如glfw、sdl、qt都没有,需要自己写win32、x11/wayland窗体再用wsi起上下文,还是非常原始非常恶心的。现在这些库都成熟了,新手学起来会方便很多。推荐一下

openGL ES 3.0 —— 有了之前的基础,这个就很简单了。openGL ES 3.0和openGL 3.3基本一模一样,这个对新手的一个砍是EGL,因为gles就没有很好的跨平台窗体封装了,自己调用EGL/EAGL和native系统结合很必要。主要参考书两本,openGL ES 3.0 programming guide,还有openGL ES 3.0 cookbook。

directx11 —— 对,我DX11是vulkan之后看的。使用的sharpDX,所以c#稍微入了点门,HLSL能看懂一些了。看的书是Direct3D Rendering Cookbook,并不是更著名的DX龙书。

DX11渲染流水线,openGL 4.3才实现渲染/计算双queue family,RTX/DRX又新加一个列簇四种shader

metal —— 这个我也是最近才研究的。因为metal相关的资料真的少,metal programming guide,这本差不多是市面上的唯一了。这本书对于图形部分收获很小,但是MPS做GPGPU,还有MPS实现CNN,都是意想不到的收获。

技能树篇:略

就业方向

在国内,图形学差不多是两大方向,一个是游戏(我的师兄们基本都做游戏了),另一个是是去建筑、设计、景观园艺相关的公司(CAD,我的师姐们很多是这个方向)。

国内的游戏引擎岗位现状和前景

国内的游戏引擎岗位,和很多人想的(自研)游戏引擎开发,可能有些差距。现在,就我个人看到的情况,是越来越多的公司开始放弃自研引擎转投unity和unreal这种更强大更完善的游戏引擎。自研引擎脱离业务,更像一个技术练兵的玩具。不过也要承认,自研引擎即便性能很好,想在客户端和美术那推行阻力也很大(原因懂的都懂)。

虽然没有自研的需求,但是不代表不需要引擎这个岗位。引擎岗依旧是游戏公司中重要的位置。主分两个方向,GE和TA。

GE招聘需求

GE —— 游戏引擎程序,在国内主要负责游戏引擎的二次开发,在现在主要是unity和unreal engine 4为主。负责内容包括但不限如下:

游戏功能脚本化,就是将游戏引擎的功能封装,给客户端用。使用脚本语言划分业务层和核心层,同时还能给程序提供热更新的能力(因为某家应用发布机制限制)。现在业内以lua为主,不过网易和腾讯内部也有些部门使用python。我个人认为python很有前景,swig/pybind11这样的轮子也很好用。

接入第三方SDK和库。第三方SDK,举几个例子,微信、支付宝的支付接口,各个平台的平台SDK,第三方埋点统计,还有硬件的SDK(安卓专属大坑,主要工作就是手工唤醒CPU大核)。外部库,举个例子,比如fmod/criware/wwise/Resonance这样的高级音频模块,lz4-HC压缩等。

修改引擎的bug。拿我负责过的一个功能举例,UE4在cook资源时只能cook LDR或者HDR一种资源,但是期望是在低端安卓机上使用LDR,在高端机上使用HDR。这时候就要修改UE4资源cook的逻辑,强行让他同时cook LDRHDR两种格式的资源。

优化。

调试渲染复杂度

TA —— 技术美术,更加万中无一的人才。虽然A转T有众多的优势,但是其实业内的情况是99%的TA都是T转A(数据来源于腾讯的一位高级技术美术口中)。TA要求又能做美术,又能写代码,必须精通引擎和各种CAD工具,普通美术日常边边角角的功能TA都应该会用。培养一位TA的成本是很高的。现在独立游戏圈有很多TA大神在单干。

TA招聘需求

至于游戏引擎的前景,只看国内,预计一两年之内可能会有个小爆发。因为看现在形势,手机的性能基本可以了,而unity的效果优化成本过大(unity2018着重处理的问题),分析的话19年开始,ue4手游会开始大幅增长,因为ue4的难度,业内会短时间增加对GE和TA的需求。

GE新手速成建议

下面是从最功利的角度,给想要入行GE的同学看的准备。

一门编译型语言。比如c++/java/go/rust/c#/swift等,话用猛汉瓦鲁多里对新手的一句建议,有偏好用偏好,没偏好用盾斧。如同python是AI的盾斧,js是web全栈的盾斧,c++就是图形学里的盾斧。c++的话,可以看c++ essential入门,看c++ primer进阶。看的时候一定要做课后题,这是忠告。

一门脚本语言。推荐js/python。我没推荐lua,因为我觉得lua的生态不是很好。可视化脚本语言,比如ue4的blueprint,unity的bolt或者Google的blocky都很有意思,不过就是写起来高效读起来卧槽,读别人代码生不如死。

熟悉一个图形API。考虑到现有所有的DX12,vulkan,metal教程都是建立在你已经有DX11/openGL的基础上写的,因此DX11和openGL就是入门的最佳选择。DX11的话,你不可能不和win32 api打交道。如果不想研究win32编程,那么openGL差不多是唯一选择了。几乎所有语言都有openGL封装,所以不用考虑语言偏好的问题。考虑到国内手游为主的情况,vulkan和metal如果有条件也还是看看,vulkan的话非常啰嗦,metal简洁很多,但是成本是有的(iPhone/iPad + mac)。

熟悉PBR。直接推荐Physically Based Shader Development for Unity 2017。表面着色,CookTorrance BRDF,microfacet theory等概念讲得都很清楚。

英文。我推荐英文的主要原因,是很多中文书我读不懂。

学历。虽然无论各个企业的HR怎么说自己只认能力不认学历,但是其实学历还是客观存在的。在GE非常明显,如果说HR只认985211,那GE这只认TOP几的虚拟现实/图形学相关专业。

项目。GitHub还有个人blog,越装逼越好。

结语

感觉已经长篇大论了不少,废话很多,望大家见谅。在图形学和游戏引擎,scene graph,shader等方面有问题或者希望看的也可以直接留言讨论。

好啦,以上就是分享我的图形学学习历程全部内容,都看到这里了还不收藏一下??搜索(CG)还能找到更多精彩内容。