每一个使用Unity的开发人员都应该熟悉components(组件)这个概念。在Unity游戏中所有的Object(对象)都包含的一定数量的的components,这些components实际影响了Oject的显示和行为。Scripts(脚本)决定了Object的行为,renderers(渲染器)决定了它们如何显示在屏幕上。Unity当中有几种渲染器,使用那种这取决于我们想要显示对象的类型。每一个3D模型都有MeshRenderer(网格渲染器),一个Object应该只有一个renderer,但每个renderer可以拥有多个matrials(材质)。这里的每个材质使用了一个Shader去修饰(定义),Shader是3D渲染流程的最后一环.组件之间的关系如下:
选择合适的文件夹,鼠标右键创建材质和Shader.
Shader "cookbook/StandardDiffuse" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
技术上来说,这是一个基于物理的(physically-based)Surface Shader, 在Unity5成为了标准Shader。从名称上可以看出,这个类型的Shader较为真实的模拟了当光照射到物体表面的时候的物理表现。如果你使用Unity4版本,将会看到生成的代码有很大的不同。在介绍基于物理的Shader之前,先看看Unity4相对来说技术上比较简单的Shader.所有这些类型的Shader都会在下一章节一一探讨。
在Unity中使用Surface Shader的环境和运行将是十分简单的工作,对于你来说只是点击几下鼠标就好。但有很多关于Surface Shader的工作Unity都已经为了做了。Unity 使用Cg 着色器语言,对其进行了精心的封装,封装了大量的细节。Surface Shader更多的是使用基于组件的思想去编写。一些例如处理纹理坐标,矩阵的变换的任务都已经为你做好了,所以再也不需要去重新编写这些逻辑。在以前,我们在编写一个新的Shader的时候我们不得不一遍一遍的重复书写一些相同的代码,随着你越来越了解Surface Shaders, 会很自然的会想要了解CG语言的底层函数和Unity在底层是怎么处理这个GPU的渲染任务的。
在Unity5中内建的Shaders是默认隐藏的,你不能在Editor中打开官方的Shader. 大部分Unity内建的CG函数,都可以在Unity的安装目录中找到(Unity45\Editor\Data\CGIncludes),在这里你可以看到Unity使用的一些工具函数的源码。还可以到官网网站上下站各个版本的内建Shaders源码.
不可以否认的是在过去十年视频图像游戏发生了翻天覆地的变化。每一款使用了最顶尖技术的新游戏都越来越接近现实环境[?]. 所以不必为Unity Shader变化十分大这个事实感到惊讶。在Unity5之前,主要有两种Shader:Diffuse & Specular. 如名称意义,它们用于不光滑和反光的材质,另外,如果以正在使用Unity5,可以选择跳过这一章节。本章节主要说明怎样移植这些效果到Unity5中。
Unity5可以自动升级Unity4版本的工程,untiy4中的shader将被替换成Unity5中的Lagacy Shader(Unity5为了兼容,而保留)
Properties 在Shader的渲染管线中十分重要,让用户可以改变纹理,调整shader的各种属性。Properties提供了为Shader的调整提供了可视化的途径。
属性的结构:
_AmbientColor (“Ambient Color”, Color) = (1, 1, 1, 1)
[变量名] [Inspector 名称] [Type] [默认值]
属性类型:
Range(min, max) float 滑动条
Color 颜色(float, float, float, float)
2D 2D 纹理
Rect ?纹理
Cube 立方体纹理
Float 浮点值
Vector 向量(float, float, float, float)
需要再SubShader中再次声明属性才可以使用。