咨询电话:400-810-1418服务与监督电话:400-006-6572
×

提交成功
我们会有专属的教育顾问联系您,请保持手机畅通。

Shader小白入门基础教程之固定管线(上)

发布时间:2020-02-25 12:47:22

今天跟大家分享Shader小白入门基础教程之固定管线(上)。在讲Shader之前,可能会问为什么游戏美术当中需要编程呢?这一点主要和两方面有关系,一方面是当前游戏美术的特征;另一方面就是当前游戏的一种说新不新但是很高效的开发模式。

1.webp.jpg

首先各位看官要明白的是,游戏美术软件,如果借用WEB开发技术来讲,也有“前端”和“后台”之分。这里的“前端”是看得见的、直观的、简易的、可直接操作的;“后台”是指不能轻易看见的、不可轻易直接操作的以及隐性的。

举例来说,在你用Maya建模的时候,软件开发者将多个复杂的代码转化成一些功能和命令,这些功能命令在菜单中可以直接找到并在3D视图中直接参与使用;可是,在一些大型项目,尤其是国外独立项目和大型次时代开发项目中,建模师或是动画师,想要表现特别、复杂或是优化表现效果时,软件当中的已有功能不能满足需要,那么这时候就不得不进行魔改,对软件“底端”进行操作,用Maya Embedded Language(也就是Mel)脚本语言进行直接命令修改、设计。

2.webp.jpg

没有编程基础的,很少能做到Mel编程。但是为什么门槛高还要有人去做呢,就在于“高门槛”带来“高回报”。有了这样的技术,可以让你基本达到“为所欲为”的目的:):有的,可以增强画面表现效果,让人惊叹“你是如何做到的”;有的,则可以“一劳永逸”,将你的这段代码作为永久插件进行使用,在你日后的工作、创作中进行运用。

这也就是为什么技术美术(TA)可以给出更加丰厚的薪酬。

3.webp.jpg

另一方面,就是和当前一种“说新不新”的游戏开发模式有关:Agile Game Development with Scrum,即Scrum敏捷游戏开发。这是一种相对于传统游戏开发流程的开发模式,它的核心就是“迭代”,确立一个小的开发周期,不断进行迭代开发。这种模式小巧、迅速且贴近市场风向,可以减低制作风险。这种开发模式,广泛的应用于当今游戏大厂和独立游戏制作人。为了在短时间内,制作出一个可交互式的游戏Demo,就需要“精兵简政”提高团队运作效率,一旦人少,那么每个人会承担额外工作,也要求美工需要多面能力,尤其是在引擎中实现美术资源与程序对接的关键环节。而类似Shader,就是其中必要的技术之一。

4.webp.jpg

我相信,除了一线的工作人员、游戏爱好者,还有很多怀揣着独立游戏制作想法的朋友们。那么引擎、shader等相关的TA领域复合技术,会更为直接的帮助你们。

二、Fixed Function Shader

在前文中,我们已经了解unity中有三种shader,而今天介绍的Fixed Function Shader就是其中一种。字面意思来讲,FFshader就是固定功能的shader,是对硬件能执行的基本的命令进行编写的shader。这类shader功能很有限,但是速度却是最快的。在unity中官方文档中,介绍说,这种shader可以在当前所有硬件设备上正常运行。

FFshader涉及五方面内容Properties(属性)、Material(材质)、Lighting(光照)、Settexture(设置纹理)以及Pass(通道)。

在之前我们介绍了Unity当中ShaderLab的基本结构

5.webp.jpg

回顾完之后,我们在unity中创建出一个Shader,这里创建的默认shader是unity中的Surface Shader。

6.webp.jpg

这里面我们仔细观察unity给的默认shader中,是没有Pass通道的,这是为什么呢?在之前我们提到过,surface shader是对顶点和片段shader的包装,这里pass通道就是被包装进去了。

7.webp.jpg

为了教学方便,现在我把Properties和Fallback块全删除,如下

8.webp.jpg

针对FF,我们在subshader中要添加pass命令,去编写一个渲染通道。这里需要注意,我在shader名称前加了一个“Weg/”,是级联菜单命令的意思。如下图

9.webp.jpg

pass命令中,第一个就是可以描述“颜色”,这个命令就是Color命令,这是个四维命令RGBA。这里我们进行实验,设置一个材质球,赋予该材质如图:

10.webp.jpg

我们在视窗中建立一个Cube,再将材质托给他,我们就看到一个不透明的白色cube了。这里我们用四维数组对颜色进行指定,那么有没有更方便的颜色选取方式呢?有的,我们就需要Properties块了,如下图

这里我们在Properties中建立了“_Color”并将它复制到下方,这里注意,pass中的color命令如果用小括号,是指这个颜色是个固定值不变的;如果用中括号,就说明这是个参数值,是可以变的。

接下来我们看看材质菜单中有了什么变化,很明显,有了color选择面板,点击时可以弹出,材质在默认状态下是不透明白色状态。(随便改个色)

现在我们又发现,这正方体是一个平面效果,并没有三维立体的感觉,这个时候该怎么办呢?我们需要一个光照。这里我们需要用一个功能命令块——“Material”材质。针对表现效果,我们需要第一个属性:diffuse,这个是用来描述漫反射效果的,可以简单理解为一个物体的固有色。代码如下

11.webp.jpg

但是呢,保存一下回去,我们发现一个问题,我们在面 color中,怎么改颜色,都还是纯白默认的样子,这是为什么呢?

12.webp.jpg

这个,就是我在讲引擎材质的时候反复强调的一个概念:质和光。你现在有一个颜色的材质,但是没有光,那么一切事物都是没有颜色的,什么也看不见。所以我们要启用光照命令。我们在pass管道后输入“lighting on”命令,意思是这条渲染管道,需要开灯。如下

13.webp.jpg

我们保存在回到界面,三维效果就出现了

14.webp.jpg

我们再观察,还是觉得怪怪的,颜色太纯,尤其是暗部背光面是受环境光的影响的,从美术角度看就是现在颜色太死。怎么办呢,我们就需要ambient命令,代码如下

15.webp.jpg

这时候我们切换回来,看到材质中多了ambient命令,并且我把它调到了粉色,会明显看到立方体暗部有粉色效果了

16.webp.jpg

暗部效果有了,但是我们会想,如果这个方体是一个光滑物体,那么他应该有高光部分吧?那如何实现呢?这时我们就需要命令,specular,代码如下

17.webp.jpg

我们保存检查,但是发现加了高光之后没什效果。这是因为在FFshader当中,如果你是用了Specular,就必须添加一个separatespecular,即镜面高光

添加代码如下

18.webp.jpg

这时我们再回到界面,调节高光,就发现高光有了明显变化

19.webp.jpg

可是呢,我事多,强度是有变化了,但是还没达到那种反光强度效果,肿么办呢?我们需要shininess一个锁点值(是一个浮点值),用来描述高光到底有多强。shininess是一个范围,我们要用到range给一个取值范围,我这里是给的0到8,默认为4。

20.webp.jpg

之后我给出了两个对比图作为效果对比(我这里为了增加对比效果换成了球)

21.webp.jpg22.webp.jpg

如果说,一个物体时自发光的怎么办呢?在FFshader中有一个命令,叫emssion,如下

23.webp.jpg

如果说emission设置为白色,就是全曝光,那么什么效果都没了,那么我降低自发光强度,于是就会出现如下效果

24.webp.jpg

今天我们讲到了一些命令,诸如diffuse、specular、ambient等等,各位看官会觉得这些个单词好熟悉啊,在8猴啊、3Dmax啊还有Maya啊,好像都见过。没错,你的感觉很对。Shader已经将大家初步带进了整个游戏视觉领域最深的部分——计算机图形图像学。他们是一个个数学模型构建的函数,来模拟真实的自然界效果。

25.webp.jpg

有了他们,才有了令人惊艳的次世代效果模型、游戏画面。所以,这就是为什么一些核心大厂敢于自创IP,就在于拥有这些底层核心技术人才,一个个惊艳的游戏效果才得以实现。如果看官想更有一番造诣,或是在建模上已经游刃有余还想得以提高,那么你下一步就是这些深刻的理论,比如实时渲染技术、PBR技术等等。有人说,这些没用,一般都不会使。这些技术有用与否,在于对自己的层次的定位和目的的选择,如果你能掌握shader、render甚至更深的一些知识,就实现了“质光结合”的材质飞跃,类似于庄子所提过的一个概念“无所恃”。请各位看官酌情适用~

来源:Thepoly 

作者:kinglary