现在是9点10分,周六,地点在公司,回想起,自己已经在这里两年出头,需要再次问一下自己。那个两年前问过自己的问题:你是想走主程项目组路线,还是引擎技术路线?
我的经历共分为如下几段
那么今天开始记录一下我的工作吧。
Marvell GPU软件工程师(Vivante)
Marvell是我毕业后参加的第一份工作。也是从这个时候开始进入图形学领域的,在此非常感谢我的老板Yan姐,和我的导师guangli姐,而在此之前我的方向是嵌入式,很明显图形学这种看得见摸得着的更适合我。
在这里,我读了5本书:《es_full_spec_2.0》、《es_spec_3.0.0》、《egl_spec_1.4》、《GLSL_ES_Specification》、《GLSL_ES_Specification_3.00.3》。
使用egl api、opengl es api写了超过数百个demo。
写了跨平台的GLSL shader runner,其实就是一个最简单的渲染引擎。
写了个GPU 调试工具,logger player,其实就是针对我们驱动的snapdragon。
学习了大量的GPU driver技术点。
这段经历,给我的图形学道路打下了坚实的技术,在这里学到的技术,一直到今天还是我的主要优势。组里的前辈大多数来自威盛公司的S3项目组,基本都是浙大图形学实验室(全国图形学重点实验室)出身。Marvell因为当年的老板是华人的原因,也是为数不多的把核心技术放在中国的外企之一。
Intel GPU软件工程(mesa)
我在Marvell所在的组是APSE,熟悉的人都知道,这个组是2006年被Intel整体打包卖给Marvell的手机业务组。所以APSE跳槽回intel的现象时有发生,我也走上了这条路,回到了Intel。
在这里,我负责维护开源3D GPU driver mesa。搭档是Intel驻khronos的3D 负责人Ian。
读了1本书:《我所理解的Cocos2d-x 》(秦春林著),并读完了cocos2d-x源码。
在Marvell的生活,我从0开始学会了很多技术知识。而在Intel,更重要的是扩展了我的见识和知识面。每周一次和Ian的电话会议,帮助我站在更高的角度去观看整个图形学的发展历史和发展方向,使我有了独立思考的能力。
完美世界 3D引擎(Ark、UE4、Unity)
我的性子活脱,喜欢看得见摸得着的事务。所以告别的GPU driver,开始往上游行业活动,凭借着对GPU driver层的理解,以及对开源游戏引擎cocos2d-x的理解,进入了上海完美3D自研游戏引擎组。
在这里,我负责自研引擎Ark从端游引擎到手游引擎的porting,并参与与项目组的需求对接和实现。
阅读UE4源码,并制作项目demo。
给使用Unity的项目组从渲染和优化上提供技术支持。
读了1本书:《Unity Shader入门精要》(冯乐乐著)。
盛趣游戏(Unity)
多年的沉淀,想实际参与一款项目,并希望负责更多的事情,所以再次跳槽,进入了盛趣游戏一款重点3D MMO项目组代号远征,在团队中担当渲染负责人。目前已经两年多过去了,项目也接近了尾声。目前我还在这家公司,这个项目组,准备在此开始记录一下工作日志。
- 2018.2.28进入团队,开始游戏demo的制作。
- 指定美术标准,和技术方向。考虑到我们的美术大多是做影视出身,于是将技术方向定为PBR方向的metallic工作流。一套贴图分三张:albedo、metallic&smoothness、normal,其他还会有一些emission等。GI效果由Lightmap + Reflectionprobe + Lightprobe进行表现。
- 为充分发挥PBR的优势,确定使用HDR+Linear。(由于OpenGL ES3.0开始支持浮点纹理和sRGB格式,所以项目最低要求明确为支持OpenGL ES3.0)
- 由于项目为3D MMO,内容肯定会很多,为避免内存和DC爆炸,将主要依赖GPU Instance(OpenGL ES3.0开始支持drawinstance)
- 由于项目为3D MMO,同屏人数要求会很高,所以制作了GPU Skin方案
- 为了实现真实天气,制作了雨(雨水、摄像机屏幕上的water drop、所有材质的湿润效果和物件表面的水流效果),雪(雪花、雪痕、物件身上的积雪)天气,以及24小时变化的云彩天空
- 为了发挥美术的后期处理特长,引入了PPSv2和lightingbox中的Global Fog、Volumetric Lighting、Depth Of Field、Sun Shaft、Ambient Occlusion、AutoExposure、Vignette、Bloom、ColorGrading、ScreenSpaceReflections(暂未启用,使用planereflection代替)、FXAA(暂未启用,使用MSAA代替)。
- 制作了一些shader,布料、描边等。
- 2018.5.30,完成了demo制作,以视频的形式过审,成功立项。
- 开始研究Unity SRP(LWRP和HDRP)。
- 开始和美术配合,进行正式资源的制作。
- 2018.10.15,完成两个正式场景的制作,以视频的形式过审,项目的第一个节点,审核通过。
- 开始进行代码整理和优化。
- 2018.12.11,游戏以iPhoneX 30FPS正常运行,2018.12.25,以手机直接运行游戏的方式过审,项目的第二个节点,审核通过。
- 开始动手根据HDRP改写,针对项目制作基于延迟渲染的SRP,借用HDRP中的cluster base lighting实现多光照,改写HDRP的GBuffer的lighting pass以符合项目的需要。下面将其称为PDRP。
- 2019.3.30,以新制作的场景过审,项目的第三个节点,审核通过。但是项目节点从2020.12月提前到了2019.9。
- 中止PDRP的制作,开始继续项目优化。
- 使用GDC 2019最新分享的顶点动画算法,实现物件在出现时,以动画的形式生长出来的效果(因玩家反馈原因,该效果暂时被关闭)
- 使用GDC 2019最新分享的风动算法+顶点动画,使得植物、布料等有动态效果
- 使用GDC 2019最新分享的踩草算法+顶点动画,实现人物走过,带动花草抖动的效果
- 2019.6.30,项目Alpha节点,审核通过。
- 开始动手根据LWRP改写,针对项目制作基于前向渲染的SRP。下面将其称为PFRP
- 完成PFRP第一版制作,并应用在项目中,成功实现了项目从build-in管线到SRP的切换。
- 扩展PFRP功能,将PPSv2的volume机制集成进来,其他效果均以pass的形式集成进入SRP,并实现了软阴影、单pass支持1+4盏光、半透明接受和投射阴影等功能。
- 2019.8.30,项目EB1节点,审核通过。
- 扩展PFRP功能,将之前在build-in管线通过commandbuffer实现的wind、trail、snow trail、distort、planereflection、ripple、rain、waterripple、radialblur、lensflare等pass集成进入PFRP。
- 使用延迟贴花,实现脚印效果。
- 2019.10.30,项目EB2节点,审核通过。
- 为了避免alpha test导致的性能损耗,针对树木等需要alpha test的物件在正式绘制之前先绘制了depth only pass,在改pass中进行alpha test处理,然后在正式绘制的时候通过ZEqual的方式规避了Alpah test。
- 使用program blending的方式(framebuffer fetch)对PFRP进行优化。
- 基于iOS TBDR架构的HSR特性。不再需要对不透明物件进行从前到后的渲染顺序,而是可以按照状态切换来进行排序渲染。这样可以大幅度减少DrawCall,提高性能。
- 基于iOS支持最新的ASTC压缩格式。项目中的贴图不再使用老的压缩格式PVRTC,而是根据贴图的种类,Diffuse贴图使用ASTC6*6格式,Normal贴图使用ASTC4*4格式,Metallic贴图使用ASTC8*8格式。新的ASTC压缩格式使用更小的尺寸,达到更好的质量效果。
- 使用DrawMeshInstance的方式,直接将植物的矩阵等信息传入,不创建GameObject,直接绘制,避免了Cull的CPU消耗。
- 2019.12.30,项目CB1节点,审核通过。2020.1.8-2020.1.10,腾讯iOS先游测试,iPhone6S及以上机型效果正常、性能30FPS。
- 针对AO,使用前一帧的AO,然后通过屏幕坐标映射的方式渲染,normal由depth的ddx、ddy计算得到,节省了性能和内存。
- 使用阴影的动静分离,针对动态物件每帧渲染,针对静态物件,每一段距离再渲染,然后将两张贴图合并后,作为shadowmap给物件使用(由于Unity没有提供阴影物件的cullreset,所以需要多进行一次cull,所以该方案暂时不启用)。
- 与美国苹果metal组讨论,将开启metal2的tile shader功能,用于msaa resolve。这样在不消耗性能的情况下,在iOS手机中使用了高质量的MSAA。
- 针对不需要从tile memory复制回local memory的RT,使用memoryless功能。
- 使用SRPBatcher,针对部分物件取代GPU Instance。
- 为了进一步节省内存,将PBR一套三张的贴图A\M\N中metallic贴图的metallic通道合并到albedo的alpha通道(针对alpha test和alpha blend的shader忽略),smoothness通道合并到normal的alpha通道。
- 贴图打开aniso各向异性,使得以近似0角度的倾斜视角观看时,依然可以达到清晰的效果。
- 除此之外,我的同事实现了海水、水涟漪、丝状头发、雪痕、SSS人物皮肤、各向异性头发等高级效果。
- 除此之外,还制作了大量工具。
原创技术文章,撰写不易,转载请注明出处:电子设备中的画家|王烁 于 2020 年 3 月 28 日发表,原文链接(http://geekfaner.com/shineengine/blog14_worknote.html)