Shader入门级教程(二)固定管线(上)
Shader技术渲染代码Thepoly 15477 0
实名

通过了实名认证的内容创造者

发布于 2022-3-26 14:21:34

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 Thepoly 于 2022-3-26 14:23 编辑

             src=http___img-blog.csdnimg.cn_img_convert_bb16c68e8b798b1ea8771e1b08482ac3.pngrefer=http___img-blog.csdnimg.webp.jpg
174551k9r66ex7z719e99h.jpg

一 教程前一些小知识

在讲Shader之前,可能会问为什么游戏美术当中需要编程呢?这一点主要和两方面有关系,一方面是当前游戏美术的特征;另一方面就是当前游戏的一种说新不新但是很高效的开发模式。


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


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


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


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


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


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


二、Fixed Function Shader

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

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

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


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


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


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


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



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


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



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


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


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


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


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


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


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


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


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


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


添加代码如下


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


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





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


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


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


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


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


PS:由于近期kinglary版主马上就要毕业了再各种忙碌,不能及时更新,请大家多多包涵哈~




目前,喜欢Thepoly的可以通过三种方式与我们建立联系。分别是公众号微信群以及QQ群


         

本帖被以下画板推荐:

还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表