本文在讨论的主题并不限于具体引擎或具体语言,为了说明方便可能会提到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.大神之路
  像龚大,余国荔,乃至卡马克这样的超级大牛,我就不清楚人家的具体工作了,但我想他们也一定是一步一个脚印走到那样的高度的。

四.程序员的求知欲


  程序员的求知欲普遍是很强的,没有太多职业像程序员一样需要一直不断的学习。即使你不出于任何其他目的,当玩游戏或者做游戏的时候,你总是要好奇,这么好的效果是怎么做出来的。于是乎就要去探究,学习,进步。不一定非要个理由,一切只是出于好奇也是可以的。随着工作越来越久,逐渐感受到知识都是相通的,重要的不是学习方法,学习能力还有学习的内驱力。现有知识早晚是要过时的,但有些东西是万变不离其宗的。所以学东西,还是要深入,究其本质,这样既符合当前利益,也符合长远利益。

  写的比较乱,总之就是为了解答一下一开始的疑惑,大家随便看看,别太当真,说的不对的请批评指正。

   未经本人同意,请勿转载。

学习游戏渲染(Shader)的用处的更多相关文章

  1. Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

    关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...

  2. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  3. (私人收藏)python学习(游戏、爬虫、排序、练习题、错误总结)

    python学习(游戏.爬虫.排序.练习题.错误总结) https://pan.baidu.com/s/1dPzSoZdULHElKvb57kuKSgl7bz python100经典练习题python ...

  4. Unity3D for VR 学习(8): Unity Shader概述

    从西安到北京高铁上,一位VR老外团队的华人leader对VR技术做了画龙点睛: “3D游戏的核心部分在Render, 国内很多团队美术.程序中间缺失严重.所以3d游戏做不好. VR这块更是至关重要.” ...

  5. 【JAVASCRIPT】React入门学习-文本渲染

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 文本渲染 1. 纯文本渲染 <!DOCTYPE html> <html> <head&g ...

  6. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  7. cocos2d-x 3.0学习游戏笔记的例子《卡塔防》第五步---开始建立游戏界面

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写.第一别全然照搬代码.第二能够说 ...

  8. three.js学习5_渲染器

    THREE.WebGLRenderer WebGL Render 用WebGL渲染出你精心制作的场景 介绍 在之前的介绍中, 已经介绍过场景, 相机, 光源, 有了这些后, 就可以形成一个可观的三维展 ...

  9. 「Django」rest_framework学习系列-渲染器

    渲染器:作用于页面,JSONRenderer只是JSON格式,BrowsableAPIRenderer有页面,.AdminRenderer页面以admin形式呈现(需要在请求地址后缀添加?fromat ...

随机推荐

  1. c51跑马灯

    ORG 0000HMOV 20H, #0FFHMOV 21H, #0FDHMOV 22H, #0FBHMOV 23H, #0F7HMOV 24H, #0EFHMOV 25H, #0DFHMOV 26H ...

  2. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  3. window.onload用法详解:

    网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的底端,这样在运行脚本代 ...

  4. PSP第九周

    一.表格 C(分类) C(内容) S(开始时间) ST(结束时间) I(打断时间) △(净工作时间) 学习 UML 12:30 13:20 0 50 编码 编码 20:00 22:10 0 130 学 ...

  5. @SuppressWarnings("deprecation")

    在Java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings("XXXX") ...

  6. LeetCode-Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not ...

  7. LeetCode 【Single Number I II III】

    Given an array of integers, every element appears twice except for one. Find that single one. 思路: 最经 ...

  8. 全面解析sizeof(下) 分类: C/C++ StudyNotes 2015-06-15 10:45 263人阅读 评论(0) 收藏

    以下代码使用平台是Windows7 64bits+VS2012. sizeof作用于基本数据类型,在特定的平台和特定的编译中,结果是确定的,如果使用sizeof计算构造类型:结构体.联合体和类的大小时 ...

  9. online_jf.lua --累计在线时间领取物品(积分)的lua脚本

    原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 ----------------------------------------------- ...

  10. Enterprise Library 6

    Enterprise Library 6 正式版 MSDN:http://msdn.microsoft.com/en-gb/library/dn169621.aspx 源码下载:http://entl ...