本文在讨论的主题并不限于具体引擎或具体语言,为了说明方便可能会提到Unity的一些内容。
最近渐渐发现很多从事游戏开发的新人,对于学会写Shader似乎总是有几分神往,但一般入了门或者学了一段时间后,想再提高时就找不到方向,也不知道学这些东西有什么用,好像只能在不会的人面前显摆显摆。特别是如今像Unity这样特别普及的引擎,可用的资源太多,几乎不需要自己懂任何渲染的知识,更不需要动手写Shader。
我就自己知道的来谈谈”关于渲染知识在工作中有什么用”。
一.理解误区
不少客户端开发新手,甚至是老手做了好几年都不知道Shader具体是指的什么。有的同学读过一些书学会了怎么写Shader实现一些效果。但知其然,不知其所以然。常常把Shader等同于游戏渲染。这是不对的,Shader只是游戏渲染中的一部分,虽然是比较重要的一部分,但不可以偏概全。不少渲染书籍也都会在前一两章谈到渲染管线的相关内容,往往都是一笔带过,要想全面的了解,还是要系统的学习。
(图片来源:互联网,这里只关注了顶点着色器和片源着色器)
像Unity这样的引擎,对渲染封装的比较厉害(有的引擎甚至连Shader都不暴露给客户端),不利于新人学习渲染。如果要了解整个图形管线的话,可以先学学UnityShader有个初步了解,然后再选择OpenGL或者DirectX来进行更系统的学习。几乎所有用引擎最终也都是依靠它们来完成渲染工作的。
二.在工作中有什么用
国内基本一个游戏项目里,至少要有一个对渲染比较有了解的人吧。我以前做客户端的时候,团队里就专门有人负责渲染问题。最基本的需求,就是要实现一些特殊效果,比如说波光粼粼的水面,旗帜烧毁时的溶解效果,盖伦大招劈下来时候的气浪等等。虽然像Unity这样的引擎有很多资源可用,但还是有效果需要自己来实现的,看看这几年国内的手游市场,不少产品都在渲染上下了很大功夫,像《崩坏3》,《天下》。像3DMMORPG这样的游戏,如果渲染上没什么亮点,很难有竞争力。所以项目里总是要有人会的。
(图片来源:互联网)
再有就是和美术人员对接,要实现各种渲染效果没有美术的支持是不可能的,但如果不了解渲染的相关知识的话,根本就没法和美术进行对接,比如你要他做个法线贴图,美术不会,而你也只是知道法线贴图可以用来增加模型细节,但是不知道法线贴图是怎么生成的,这样工作就没法进行了。再举个例子,玩过3DS口袋妖怪XY之后的版本你会发现里面各个宝宝的卡通渲染看起来很棒,而由于3DS的机能十分有限(老任的机能一向是最弱的),为了节省资源,每张贴图甚至通道都要物尽其用,设计的很巧妙,很显然这种贴图的使用方式不可能是美术突发奇想,而一定是在程序的指导下绘制的。
(图片来源,Trace翻译口袋妖怪X/Y制作技法)
最后一点可能就是性能优化了,上线之前每个项目都要拼了命的优化性能,以便兼容更多的低端机型,特别是手游,Boss们往往是既要效果又要帧率。这段时间一般是比较痛苦的,像Unity这样用户庞大的引擎,网上有很多优化经验,很多书也会有专门章节来如何优化。像合并批次,减少特效透明重叠区域,降低阴影质量,改变lightMap分辨率,不要在Shader中使用AlphaTest等等,往往大家对这些都是知道的,不知道也至少听说过。但如果不知道背后的原理,不知道为什么这么做,那便是是隔靴搔痒,无法举一反三。遇到一些特殊的情况,就找不到思路了。如果能了解更多的渲染知识,那么优化起来会更加得心应手。
三.工作方向
有人问,是否有与渲染(Shader)相关的专门工作,当然是有的,我跟自己了解的大概分了以下几类:
1.专门负责渲染工作的客户端程序员
我在上面提到过的,一个团队里总要有几个人懂点渲染的,他们在团队里一般不写逻辑功能,专门实现各种渲染效果,并负责跟美术进行工作对接,在最后的项目优化时负责渲染部分的优化工作。有的公司还会专门成立一个部门来负责这部分工作,项目团队只负责逻辑开发,渲染效果和优化全部都由这个团队负责。这应该是最常见的一类了,这几年大家的水平应该都有所提高吧,我看很多Unity程序员招聘的时候都写着,会Shader有加分。不过这个“会”水分就很大了。
2.技术美术(TA)
这曾经是我比较神往的职位,不过自己美术实在太渣。有个前辈曾跟我水哦过:“TA至少要是50%的美术”。这个职位在国内是不常见,国外比较多。TA一般是属于美术团队的,或者是一个单独团队,不属于客户端程序。对于有TA的项目开发流程不太一样,项目一般会提出需求,而TA负责实现,TA可以简单理解为即会写Shader又会做模型的人。往往是对美术方面的的要求比程序方面的要求高,必须对整个美术工作流程都比较清楚。这样的工作流程做出的效果往往是效率比较高的,TA在制作的同时就考虑了美术效率的问题。
3.游戏引擎开发
此处指自研引擎的开发。不是说使用XX引擎开进行游戏开发。现在国内普遍都是在做手游,很多都在用Unity,还在使用自研引擎的公司实在是不多了。这个工作要求对渲染知识的了解就比较高一些了,不是说会写几个效果就可以的,必须对整个渲染流程有比较系统的了解。当然了游戏引擎不只是有渲染一个方面,还有比如资源管理,UI系统,物理系统等,想想自己动手开发(维护)个Unity,头都大,一般不太可能一人完成,引擎开发的团队一般都稍微大一些,由于引擎的目标用户是客户端程序员和美术,测试,而不是玩家,所以作为工具链的起点,必须保证引擎的稳定和高效,这就需要比较好的语言知识(市面上绝大多数引擎都是C++实现的)。
自研引擎的一大好处就是可以随便改,在性能优化的时候,由于能直接调试引擎源代码,也比较容易定位性能热点。有个问题就是,如果你是Unity程序员如果引擎本身有了Bug你就只能忍着,或者绕过它,但如果是自己的引擎,你就一定要查个究竟了。
4.大神之路
像龚大,余国荔,乃至卡马克这样的超级大牛,我就不清楚人家的具体工作了,但我想他们也一定是一步一个脚印走到那样的高度的。
四.程序员的求知欲
程序员的求知欲普遍是很强的,没有太多职业像程序员一样需要一直不断的学习。即使你不出于任何其他目的,当玩游戏或者做游戏的时候,你总是要好奇,这么好的效果是怎么做出来的。于是乎就要去探究,学习,进步。不一定非要个理由,一切只是出于好奇也是可以的。随着工作越来越久,逐渐感受到知识都是相通的,重要的不是学习方法,学习能力还有学习的内驱力。现有知识早晚是要过时的,但有些东西是万变不离其宗的。所以学东西,还是要深入,究其本质,这样既符合当前利益,也符合长远利益。
写的比较乱,总之就是为了解答一下一开始的疑惑,大家随便看看,别太当真,说的不对的请批评指正。
未经本人同意,请勿转载。