unity-shader-Unity3D的着色器介绍(二)——Unity3D的Shader基本结构说明
Unity3D的Shader基本结构说明,原文链接:http://liweizhaolili.lofter.com/post/1cc70144_585f714
Unity3D里面有三种Shader的类型:
- fixed function shader
- vertex and program shader
- surface shader
这三种Shader的区别,我打算在下一篇文章里面再说,现在我们先看一看通用的一些结构。
随便打开一个Unity自带或者你从网上下载的Shader文件,你可以看到大概的结构都是像下面这样的:
标准shader的结构:
//着色器名称
Shader “MyShader” {
//参数
Properties {
_MyTexture (“My Texture”, 2D) = “white” { }
// 继续添加其他的参数
}
//子着色器,从上而下的运行
SubShader {
// 着色器主体可以是
// - surface shader 或者
// - vertex and program shader 或者
// - fixed function shader
}
SubShader {
// 这里可以写一个相对简单的子着色器,让比较旧的显卡也能运行
}
}
着色器结构说明:
从上面的结构例子可以看出,着色器由着色器名称、参数和子着色器三部分构成。
着色器名称:用于查找着色器时的名称
参数:决定了在材质栏里面显示的可选输入参数,比如贴图、颜色等
子着色器:是着色器的主体,负责输入、计算和输出。
名称就没什么好讲的地方了,定好名称之后,这个着色器就会在相应的shader目录下面出现,当然在其他代码里面调用,你也可以通过Shader.Find来找到对应名称的shader。
参数部分可以做一下解释:
格式:_Name(“Display Name”,type) = defaultValue{options}
解释:
变量类型:
Color:颜色,RGBA
赋值举例:(1,1,1,1)
2D:贴图
Rect:长宽为2的次方的贴图
Cube:立方体纹理
赋值举例:字符串,比如””、”white”、”black”、”gray”、”bump”
贴图可选option:
TexGen:自动生成一些特定的UV纹理特效,主要用于Fixed Function Shader。注意,如果使用了顶点程序,TexGen将会被忽略
ObjectLinear、EyeLinear、SphereMap、CubeReflect、CubeNormal
举例:_MainTex (“Base (RGB)”, 2D) = “white” {TexGen EyeLinear}
LightmapMode :如果设定了,这个贴图将会per-render时的光照贴图参数,意思是这个贴图不在材质里面用,而是从渲染设置代替
Range(min,max):介于最大值和最小值之间范围的浮点数
Float:浮点数
赋值举例:浮点数
Vector:四维数
赋值举例:(x,y,z,w)
子着色器****SubShader解释
1、标签(Tags)
1.SubShader Tags
写法:
写在SubShader的第一句
Tags { “TagName1” = “Value1” “TagName2” = “Value2” }
比如
Tags { “RenderType”=”Opaque” }
标签类型:
Queue:渲染队列,控制渲染的顺序。
参数:
Background :最先渲染的类型,一般用作背景和天空盒
Geometry :默认类型,第二渲染
AlphaTest :第三渲染,透明度测试
Transparent :第四渲染,半透明显示
Overlay :最后渲染叠加的内容
以上的参数控制顺序是靠各自的值来排序的:
Background is 1000, Geometry is 2000, AlphaTest is 2450, Transparent is 3000 and Overlay is 4000
所以如果想再细分渲染的顺序,可以Tags { “Queue” = “Geometry+1” },如此类推
RenderType :渲染类型,基本是用于Shader Replacement时候的标签
参数:
•Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders).
•Transparent: most semitransparent shaders (Transparent, Particle, Font, terrain additive pass shaders).
•TransparentCutout: masked transparency shaders (Transparent Cutout, two pass vegetation shaders).
•Background: Skybox shaders.
•Overlay: GUITexture, Halo, Flare shaders.
•TreeOpaque: terrain engine tree bark.
•TreeTransparentCutout: terrain engine tree leaves.
•TreeBillboard: terrain engine billboarded trees.
•Grass: terrain engine grass.
•GrassBillboard: terrain engine billboarded grass.
ForceNoShadowCasting:强制不产生阴影。
参数:true
IgnoreProjector:忽略投影
参数:true
当设置为true时,该物体本身就不接受灯光投影
2.Pass Tags
区别于SubShader Tags,Pass Tags是写在pass内部的
标签类型:
1)LightMode tag
控制渲染管线里面的灯光管线
具体参数:
•Always: Always rendered; no lighting is applied.
•ForwardBase: Used in Forward rendering, ambient, main directional light and vertex/SH lights are applied.
•ForwardAdd: Used in Forward rendering; additive per-pixel lights are applied, one pass per light.
•PrepassBase: Used in Deferred Lighting, renders normals & specular exponent.
•PrepassFinal: Used in Deferred Lighting, renders final color by combining textures, lighting & emission.
•Vertex: Used in Vertex Lit rendering when object is not lightmapped; all vertex lights are applied.
•VertexLMRGBM: Used in Vertex Lit rendering when object is lightmapped; on platforms where lightmap is RGBM encoded.
•VertexLM: Used in Vertex Lit rendering when object is lightmapped; on platforms where lightmap is double-LDR encoded (generally mobile platforms & old dekstop GPUs).
•ShadowCaster: Renders object as shadow caster.
•ShadowCollector: Gathers object’s shadows into screen-space buffer for Forward rendering path.
2)RequireOptions tag
某些pass需要在质量设置里面开启了对应的设置,才会渲染。比如SoftVegetation
2、渲染设置
1.LOD级别
假如设定LOD级别(默认时是200),我们可以在质量控制里面设置某个质量级别能支持的最大LOD级别。如果设定支持的lod级别比shader需要的级别低,那该shader就不可用。
参考网上的资料:
VertexLit及其系列 = 100
Decal, Reflective VertexLit = 150
Diffuse = 200
Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250
Bumped, Specular = 300
Bumped Specular = 400
Parallax = 500
Parallax Specular = 600
2.Material { Material Block }
这个模块控制了顶点光照的信息,包括漫反射、高光、环境光等
Diffuse: Color
默认颜色组件,基本颜色
Ambient: Color
环境颜色组件,物体在被RenderSettings里面设置的环境光照射时的颜色
Specular: Color
高光反射颜色
Shininess: Number
高光的锐利度,在0到1之间,0时高光巨大,1时高光尖锐。
Emission: Color
自发光,当物体没有被任何光线照射时的颜色。
最终颜色:
Ambient * RenderSettings ambient setting +
(Light Color * Diffuse + Light Color * Specular) + Emission
3.Lighting On | Off
控制顶点光照的开关
4.Cull Back | Front | Off
控制剔除的面
5.ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
深度测试模式,小于、大于、小于等于、大于等于、等于、不等于、一直时,才显示。
6.ZWrite On | Off
深度写入的开关
7.Fog { Fog Block }
这个模块可以给物体单独设置雾的效果。
示例:
Fog
{
Mode Exp2//Off | Global | Linear | Exp | Exp2
Color [_Color]
Density 0.1
Range 0,300
}
8.AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
透明度测试,小于、大于、小于等于、大于等于、等于、不等于某值时显示
9.Blend SourceBlendMode DestBlendMode
设置混合模式。
One The value of one - use this to let either the source or the destination color come through fully.
Zero The value zero - use this to remove either the source or the destination values.
SrcColor The value of this stage is multiplied by the source color value.
SrcAlpha The value of this stage is multiplied by the source alpha value.
DstColor The value of this stage is multiplied by frame buffer source color value.
DstAlpha The value of this stage is multiplied by frame buffer source alpha value.
OneMinusSrcColor The value of this stage is multiplied by (1 - source color).
OneMinusSrcAlpha The value of this stage is multiplied by (1 - source alpha).
OneMinusDstColor The value of this stage is multiplied by (1 - destination color).
OneMinusDstAlpha The value of this stage is multiplied by (1 - destination alpha).
常用的混合模式:
Blend SrcAlpha OneMinusSrcAlpha //透明混合
Blend One One // 叠加
Blend OneMinusDstColor One // 软叠加
Blend DstColor Zero // 相乘
Blend DstColor SrcColor // 2x 相乘
10.Color Color value
当Light off时设置颜色
11.ColorMask RGB | A | 0 | any combination of R, G, B, A
过滤颜色,如果参数是RGB的一种或几种时,将过滤参数的颜色,如果是0,将过滤所以颜色
12.Offset OffsetFactor , OffsetUnits
设置Z缓存深度偏移
13.SeparateSpecular On | Off
控制顶点光照的高光开关,如果开了,那么在物体最终颜色基础上再加上高光颜色
14.ColorMaterial AmbientAndDiffuse | Emission
使用材质颜色代替环境光、漫反射或者自发光
以上等于是说明书一样把用到的设置项都列举了一下,具体用途其实是在用到的时候,可以直接查看一下。
看完名称、参数和子着色器的解释之后,再去看其他人写的shader,应该就比较能清楚大概是什么意思了吧?
下一次的内容将会是三种不同类型的着色器程序(fixed function shader、 vertex and program shader、 surface shader) 的区别。