创建一个基本的 Standard Shader
作为一个unity的开发者,大家都知道components,所有的objects都包含了一系列的components。scripts决定了objects的逻辑,renderers决定了表现。而所有的renderers都包含几个materials。每个material都包含一个独立的shader。他们的关系如上图。
准备阶段
- 运行untiy5并打开一个新的工程
- Assets目录下新建文件夹:Shaders
- Assets目录下新建文件夹:Materials
如何实现
- 在Shaders文件夹下右键Create/Shader/Standard Surface Shader新建一个shader;
- 在Materials文件夹下右键Create/Material新建一个material;
- 把刚新建的shader和material重命名为StandardDiffuse;
- 把新建的shader拖给新建的material;
- 在场景中新建一个Cube,把新建的material拖给Cube
- 可以添加一个Texture给material
具体效果
解释说明
打开的shader像这个样子:
Shader "Custom/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"
}
我们可以发现unity已经帮我们写了很多内容,初步需要知道:
1.第一行表明了这个shader在Unity中的路径,它会出现在你选择某个Material的shader时的下拉列表里,并且可以随时更改;
2.最后一行表明,当这个shader在当前环境中运行失败后,会默认调用Unity自带的Diffuse Shader;
这就是一个简单基于physically-based rendering的Surface Shaer,你会发现它和Unity4有很大的不同。在引入physically-based shaders前,Unity4使用了更复杂的方法。而Unity内部使用Cg语言实现,在Unity\Editor\Data\CGIncludes可以查看。
欲知后事如何,且听下回分解