Unity中的Shader模板
- Standard Surface Shader 包含了标准光照模型的表面着色器
- Unlit Shader 不包含光照(包含雾效)的基本顶点/片元着色器
- Image Effect Shader 屏幕后处理特效模板
- Compute Shader 利用GPU并行性,处理与常规渲染无关计算
- Shader Variant Collection 减少Shader变体,增加效率,减少内存。太高端,先不管了。。。
Unity中的Shader模板
顶点/片元着色器(Vertex/Fragment Shader):(Pass中写CG代码)
//自定义Shader属性名称,可带路径,例如下边Chan下名称Shader_1的Shader
Shader "Chan/Shader_1"
{
//仅仅是让属性在Material面板中设置,可以在CG代码中定义变量,可以通过脚本向Shader传递这些属性值
Properties
{
//各种属性定义 ShaderName("DisplayName",PropertyType) = DefaultValue
//ShaderName = Shader中用到的变量名称
//DisPlayName = Material面板代表ShaderName值的名称
//DefaultValue = 设置一个默认值
_Int("Int",Int) = 1
_Float("Float",Float) = 0.5
_Range("Range",Range(0.3,0.9)) = 0.6
//四维向量
_Color("Color",Color) = (1,1,1,1)
_Vector("Vector",Vector) = (2,3,5,4)
//内置纹理名称(white,black,gray,bump)
_2D("2D",2D) = ""{}
_3D("3D",3D) = "black"{}
_Cube("Cube",Cube) = "white"{}
//
_MainTex ("Texture", 2D) = "white" {}
}
//一个Shader中可包含多个SubShader,最少有一个。Unity会扫描所有的SubShader语义块,
//然后选择第一个能够在目标平台运行的SubShader,所有SubShader都不支持,Unity会调用Fallback语义指定的Shader
SubShader
{
//标签设置 可选 key/value键值对形式 SubShader中定义和Pass中定义的标签类型不一样
Tags { "RenderType"="Opaque" }
//1.渲染状态设置 可选 在Pass中定义,对此SubShader中所有Pass适用,定义在某个Pass,只在定义的Pass中起作用
//2.在SubShader中定义和Pass中定义使用的语法是相同的
ZWrite On
Pass
{
//标签设置 可选 和SubShader中的类型有区别
//设置渲染状态 可选 和SubShader中的类型一致
CGPROGRAM
//CG语法
ENDCG
}
Pass{...}
}
SubShader{...}
SubShader{...}
//上边三个SubShader都不支持,Unity会调用Fallback语义指定的Shader
Fallback "Diffuse"
}
表面着色器(Surface Shader):(通过顶点/片元着色器抽象封装而来,处理了很多光照细节,SubShader中写CG代码)
Shader "Custom/NewSurfaceShader" {
Properties {...}
SubShader {
//标签设置 可选
//渲染状态设置 可选
CGPROGRAM
...
void surf (Input IN, inout SurfaceOutputStandard o)
{...}
ENDCG
}
FallBack "Diffuse"
}
固定函数着色器(Fixed Function Shader):(不能写CG代码,只能用Shaderlab语法)
Shader "Custom/Fixed Function" {
Properties {
_Color("Main Color",Color) = (1,1,1,1)
}
SubShader {
Pass
{
Material
{
Diffuse[_Color]
}
}
Lighting On
}
}
Unity5.2后,固定函数着色器也是转化为顶点/片元着色器,因此Unity中只有一种Shader。