在Unity中材质与Shader的关系很紧密。Shader中的代码定义使用什么样的属性和资源。材质允许我们调整属性以及指定资源。
上图的Shader 是通过一个材质实现的
要创建一个新的材质,可以通过 Material, use
,然后可以把它直接拖到游戏对象上以应用之。
Shader 的技术细节
Unity 中大量的 Shader 系统。让我们可以调整游戏的内置图形效果。其工作原理是像这样的:
Shader 从根本上说是为游戏内置的shading外观定义了一个公式。在Shader内部有一些属性(典型地是纹理),Shader是通过材质实现的,材质是直接附加到每个GameObject上的。在材质内部,可以选择一个Shader,然后定义Shader要用到的属性(通常是纹理和颜色,但还有很多其他的)
过程相当复杂,流程是下面这样的:
左边的图是Carbody Shader,2个不同的材质通过Blue car Material和Red car Material创建的,这2种材质都各指定了2个纹理:Car Texture 定义了车的主要纹理,另一个纹理是Color FX。Shader的这些属性让车看起来有两种色调。
可以看到红车的前面:面对摄像机的是黄色,然后角度越大就越褪成紫色。材质被附加到两个车上。车轮,灯和车窗没有变色效果,因为要用到不同的材质。
图的底部是一个Simple Metal Shader,Wheel Material 用了这个Shader。
具体地说, Shader 定义了:
- 渲染物体的方式,包括根据用户的不同的显卡使用不同的方式。
- 任何用于渲染的顶点和片断的程序。
- 材质内部可赋值的纹理属性。
- 材质内部可赋值的颜色和数量设置。
材质定义了:
- 用哪个纹理渲染。
- 用哪个颜色渲染。
- 任何其他资源,比如shader渲染要用到的Cubemap。
Shader是图形程序员的命中注定。用ShaderLab语言创建,非常简单。但是,要让shader很好地运行在各种各样的显卡上就不容易了。
Unity直接内置了大量的 shaders,在 Standard Assets Library 库中还有更多。