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}

解释:

  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) 的区别。