本文转自 Unity Connect 官方博主 taecg
前言
Shader,中文名为着色器,对很多开发者来说它是一个神秘的存在,想学但是又不知道如何去学,或者学了一段时间发现 Get 不到它的点,始终感觉游离在外,无法开窍。
那么本专栏( Unity 技术美术)在前几篇介绍了美术资源标准后,打算接下来花一些篇章来讲下如何从零基础入门 Shader,目的在于让初学 Shader 的程序或者美术可以快速进入这个丰富多彩的世界。
什么是 Shader
虽然上面有简单的说了下 Shader 就是着色器,但是还是有必要详细说明一下具体什么是 Shader。
Shader 其实就是专门用来渲染图形的一种技术,通过 shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果。小到每一个像素点,大到整个屏幕。
Shader 分为两类 :
顶点 Shader ( 3D 图形都是由一个个三角面片组成的,顶点 Shader 就是计算每个三角面片上的顶点,并为最终像素渲染做准备)。
片断 Shader,顾名思义,就是以片断为单位,计算光照、颜色的一系列算法。 几个不同的图形 API 都有各自的 Shader 语言,在 DirectX 中,顶点 shader 叫做 Vertex Shader,片断 Shader 叫做 Pixel Shader,也就是像素着色器; 在 OpenGL 中,顶点 Shader 也叫做 Vertex Shader,片断 Shader 叫做 Fragment Shader,也就是我们常说的片断 Shader 或者片元 Shader。
说白了,Shader 其实就是一段代码,这段代码的作用是告诉 GPU 具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。
Shader 编程语言
既然 Shader 是一段代码,那必然要用一种语言来书写它,目前主流的有三种语言:
1.基于 OpenGL 的 OpenGL Shading Language,简称 GLSL。
2.基于 DirectX 的 High Level Shading Language,简称 HLSL。
3.还有 NVIDIA 公司的 C for Graphic,简称 Cg 语言。
GLSL 与 HLSL 分别是基于 OpenGL 和 Direct3D 的接口,两者不能混用。而 Cg 语言是用于图形的 C 语言,这其实说明了当时设计人员的一个初衷,就是让基于图形硬件的编程变得和 C 语言编程一样方便,自由。正如 C++和 Java 的语法是基于 C 的,Cg 语言本身也是基于 C 语言的。如果您使用过 C、C++、Java 其中任意一个,那么 Cg 的语法也是比较容易掌握的。Cg 语言极力保留了 C 语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg 同时拥有高级语言的好处,如代码的易重用性,可读性高等。
Cg 语言是 Microsoft 和 NVIDIA 相互协作在标准硬件光照语言的语法和语义上达成了一致,所以,HLSL 和 Cg 其实是同一种语言。
美术人员看到这里时也不用害怕,语法上并不难,而且在后续的章节中碰到相关的语法时我们会详细的进行说明。
什么是 Unity Shader
显卡有 NVIDIA、ATI、Intel 等等。。。
图形 API 有 OpenGL、DirectX、OpenglES、Vulkan、Metal 等等。。。
Shader 编程语言有 GLSL、HLSL、Cg 等等。。。
是不是有点头晕,该怎么去选择呢?在 Unity 中我们又应该如何做呢?
其实在 Unity 中反而一切变的简单起来了,我们只需关心如何去这实现我们想要的效果就好了,其余的事情全部交给 Unity 来自动处理。因为我们在 Unity 中编写的 Shader 最终会根据不同的平台来编绎成不同的着色器语言,那么我们在 Unity 中应该用什么语言来书写 Shader 呢?
官方的建议是用 Cg/HLSL 来编写,当然你也可以使用 GLSL,主要是因为 Cg/HLSL 有更好的跨平台性,更倾向于使用 Cg/HLSL 来编写 Shader 程序。
Unity Shader 严格来说并不是传统上的 Shader,而是 Unity 自身封装后的一种便于书写的 Shader,又称为 ShaderLab。
在 Unity 中有 3 种 Shader (其实就是三种不同的写法):
1.Surface Shaders 表面着色器
2.Vertex/Fragment Shaders 顶点 /片断着色器
3.Fixed Function Shaders 固定管线着色器
其中 Fixed Function Shaders 已经被淘汰,完全没有学习的必要了。
Surface Shader 其实就是 Unity 对 Vertex/Fragment Shader 的又一层包装,以使 Shader 的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。
但是 Surface Shader 也有它的局限性,就是 Vertex/Fragment Shader 能实现的效果,Surface Shader 不一定能实现,反过来则成立,Surface Shader 能实现的 Vertex/Fragment Shader 则一定可以实现。
并且在 Unity2018 后的版本中推出了 Unity 官方自己的可视化 Shader 工具( Shader Graph )。从生成的代码上来看,也全部是用的 Vertex/Fragment Shader,那是不是可以理解为在今后的可编程渲染管线中,Unity 自己也抛弃了 Surface Shader,而全部采用了 Vertex/Fragment Shader ?
总之,在今后的学习过程中,也会涉及一些 Surface Shader 的内容,但主要还是会以 Vertex/Fragment 为主。
另外,学会 Shader 也会给我们带来很多的好处:
游戏中模型显示粉色的情况你一定碰到过吧,是 Shader 丢失呢,还是 Shader 不符合当前平台呢,又或者是 Shader 上有语法的错误呢?如果我们有了解并学会 Shader 的话,这些问题就不会再是一脸懵逼啦。
內建 Unity Shader 仅仅只是“通用”用例,不足以满足我们所有的画面表现需求。
一旦掌握 Shader,可以为游戏 /应用创造独一无二的视觉享受。根据实际需求,为游戏和应用实现特定功能的 Shader。
能大大的帮助我们做渲染上的性能优化,因为通过 Shader 可以控制渲染什么以及如何渲染。
撰写 Shader 的能力对于游戏团队非常重要,掌握 Shader 技能的开发一直是炙手可热的职位。现在一个不争的事实就是,技术美术永远是各大厂商的稀缺资源。
好处多多,大家快快学习起来吧~
文章链接
https://connect.unity.com/p/ling-ji-chu-ru-men-unity-shader-yi?app=true
更多相关知识欢迎大家使用 Unity 官方 app 关注该博主~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.