以下内容基本解释与协助回忆,初学的同学还请在书中好好学习,推荐《Unity Shader入门精要》人民邮电出版社的。如果错误的地方,请多多提点。
Material是什么?
Material是材质,包含渲染脚本和资源和各个参数.
在Unity中Shader需要和材质(Material)放在一起才能发生效果。
Shader用于编写材质的内容以什么样的方法进行渲染显示。
ShaderLab是什么?
是Unity专门为Unity Shader提供的语言,让开发人员可以更轻松的控制Shader,所有的Unity Shader都是用ShaderLab来编写的。
Unity Shader的基本结构
Shader "Custom/TestShader1" {
Properties
{
//Name:属性名 DisplayName:显示名 PropertyType:类型 DefaultValue:默认值
Name("DisplayName",PropertyType)=DefaultValue
//更多属性...
}
SubShader{
Pass{
CGPROGRAM
ENDCG
}
}
}
Unity中的着色器有哪些?
表面着色器 代码量少,因为Unity在背后做了很多工作,渲染代价较大。是片元/顶点着色器更高一层的抽像,可以使用Cg/HLSL来写,CGPROGRAM和ENDCG在SubShader之间是因为不用关心有多少个Pass每个怎么渲染他将会自行处理。
Shader "Custom/TestShader1" {
SubShader{
Tags {"RenderType"="Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float4 color:COLOR;
};
void surf(Input IN,inout SurfaceOutput o){
o.Albedo=1;
}
ENDCG
}
Fallback "Diffuse"
}
顶点/片元着色器
CGPROGRAM和ENDCG在Pass之间好处是可以控制细节,可以使用Cg/HLSL来写。
Shader "Custom/TestShader3" {
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(in float4 v:POSITION):POSITION
{
return UnityObjectToClipPos(v);
}
float4 frag(in float4 col:COLOR):COLOR{
return float4(1,0,0,1);
}
ENDCG
}
}
}
固定管线着色器
用于一些较旧的设备,需要完全用ShaderLab的语法而非Cg/HLSL。
Shader "Custom/TestShader4" {
Properties{
_Color("Main Color",Color)=(1,0,0,1)
}
SubShader{
Pass{
Material{
Diffuse [_Color]
}
Lighting On
}
}
}
如何选择着色器呢?
1、需要或必须在旧设备上运行的就要固定函数着色器。
2、如果需要和很多光源打交到的,用表面着色器,但要小心移动平台的性能表现。
3、如果光照非常少或有很多自定义效果的则使用顶点/片元着色器。
从本质上来说UnityShader只有两种形式,顶点/片元着色器和固定函数着色器,在Unity5.2以后固定函数着色器也转了顶点/片元着色器。所以本质上来说都是顶点片元着色器。
可以用GLSL来写吗?
可以,但是跨平台会有问题,目标平台只有Mac OS X、 OpenGL ES 2.0 或是Linux。