Unity3D的着色器介绍(二)——Unity3D的Shader基本结构说明

上一篇着色器介绍文章,阿赵我大概的说明了一下软渲染的过程,用于解释着色器的基本工作流程,不知道看过的人是否能知道阿赵想说什么呢?原理的东西基本都是通用的,所以可以说上一篇文章和Unity本身是没什么直接关系的。
接下来说点和Unity有关的东西,比如说在Unity里面的Shader应该怎样写,从哪里下手?要不先说一下Shader的基本结构吧。

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}
解释:
1、变量类型:
Color:颜色,RGBA
赋值举例:(1,1,1,1)
2D:贴图
Rect:长宽为2的次方的贴图
Cube:立方体纹理
赋值举例:字符串,比如””、”white”、”black”、”gray”、”bump”
2、贴图可选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) 的区别。

猜你喜欢

转载自blog.csdn.net/liweizhao/article/details/81352235