着色器对于游戏开发者一直充满神秘感,但是一旦你真正理解它,你会发现它不是特别复杂,可以帮你实现奇思妙想。今天Unity大中华区技术经理鲍健运将为大家分享,如何由浅入深学习撰写Unity着色器脚本,实现美妙有趣的画面效果,带领大家叩开着色器开发的大门。
概述
便于大家的理解,我列举一个现实生活中的例子。这个大家一眼应该就能马上辨认出来,梵高的名画《向日葵》。它实在是太过有名,以至于不少人喜欢搞一件仿制品挂在墙头,为房间的装饰增添美感。
但是仿制品的生产依靠的是血汗工厂,因为制作这样一幅油画,需要一笔笔画出每个部分,非常地耗时耗力,因此我不得不以5倍速去播放它的绘制过程。如果观察右边的这幅《向日葵》,你会发现它是原有画作三角化的效果,分分钟从印象派风格变成了马赛克风格,而这个画面表现实际就是Unity着色器的效果。
事实上,着色器与中国古代四大发明之一的活字印刷术有点渊源。最早的活字印刷术虽然诞生于中国,但是兴盛与欧洲。因为字母文字系统得天独厚的优势,只需准备一些金属字模,然后根据文本的需求进行排布,就可高效无误地印刷安排工整书页。这种内容编排与批量印刷的过程,与着色器实现渲染的过程是极其相似的,即批量将像素绘制到屏幕上。
这个画面应该不少开发者碰到过吧,非常令人讨厌的粉红色Mesh。它意味着你的着色器出问题了。可能是着色器没有正确加载到,或者是设备太差而该着色器设置过高不适用等等。想要知道它为什么出错,就需要去了解什么是着色器,应该如何去写。
但是由于着色器会牵涉到些图形学和线性代数的知识,出现一个大家不太熟知的数学公式,很可能会给大家造成“Shader貌似非常复杂”的感觉。当然,写出复杂画面表现的Shader会耗费不少功夫,但是大家不需要担心,因为我们会带领大家以比较舒适的方式进入这个世界。
学习Shader的优势
1.內建Unity Shader仅仅是“通用”用例。这些通用的范式基本可以涵盖60%左右的需求和情况,但是不以满足你所有的画面表现需求。
2.一旦掌握Shader,可以为游戏/应用创造独一无二的视觉享受。根据实际需求,为游戏和应用实现特定功能的Shader。
3.仅仅通过少量代码,就能实现非常有趣的效果。有时候,单单只是需要稍微处理一下顶点或片元函数。
4.它能大大帮助性能优化,因为通过Shader可以控制渲染什么以及如何渲染。
5.撰写Shader的能力对于游戏团队非常重要,掌握Shader技能的开发一直是炙手可热的职位。现在一个不争的事实就是技术美术永远是各大厂商的稀缺资源。
6.如果你已经掌握其他语言的编程,Shader对你而言不会很复杂。因为它本身不会比其他编程语言多些内容,主要处理的还是一些变量与方法。
Unity Shader 典型案例
让我们看看实际的案例吧。这款游戏就是大家非常熟知的暴雪大作《炉石传说》。
它是暴雪第一款正式的移动游戏,也是Made With Unity的游戏。这里展示的就是Unity Shader的特效效果。卡牌的绿色勾边,角色爆炸的感觉,中间桌面轮廓的星河以及产生流动感的各种绚丽效果都是通过着色器实现出来的。给玩家带来的是不是一种非常震撼的享受?
介绍了这么多,那么Shader到底是什么呢?事实上,它是“一个告诉计算机以某种方式描绘物体的程序”。
Unity着色器构成
Unity着色器是怎么写的呢?到现在我们还没看到它的真面目。从编程语言层面来说,它所使用的是NVIDIA CG语言或微软的HLSL语言去编写,而它们都集合到我们专门的ShaderLab语言中。在应用中,点击T键可以切换显示。
这里就是一个典型的Unity Shader文件,包含了所有的基本元素。该脚本的整体其实就是ShaderLab代码内容,而其中被这个CGPROGRAM和ENDCG包裹的部分就是CG\HLSL语言部分。
常用 Shader 类型
自Unity 5.x起基本常用的Shader就是这上图三种类型,原来还有针对一些旧型号GPU的固定函数着色器已经被时代所淘汰。
1.Vertex & Fragment Shader:顶点/片元着色器。它是最基本,也是非常强大的着色器类型。一般用于2D场景、特效之类的。从上图左边部分,大家可以看到它绘制出一个蜘蛛机器人的纹理,但是不受任何光线的影响。
2.Surface Shader:表面着色器。它拥有更多的光照运算,其实在系统内部它会被编译成一个比较复杂的顶点/片元着色器。从上图中间部分,与左边的比较我们不难发现,这个3D的蜘蛛机器人有明亮的部分,也有阴影,甚至还带有一定的金属光泽。
3.Standard Shader:标准着色器。它是表面着色器升级的版本,因为它使用了Physically Based Rendering(简称PBR)技术,即基于物理的渲染技术。所以在这个着色器中开放了更多处理光照与材质的参数。仔细观察上图右边部分的蜘蛛机器人,更多不同质感的部件被表现出来。机器人自带灯的光照,足部的金属质的甲片,机壳略微的锈迹丰富了这个物件的画面呈现。
更多unity2018的功能介绍请到paws3d学习中心查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213
近期更有资深开发人士直播分享unity开发经验,详情请进入官网或加入QQ群了解