- SubShader{…} 首先,subshader才是整个shader的核心。每个shader可以拥有一个或多个subshader,实际运行时会从上而下依次实验,直至运行到第一个当前硬件支持的subshader。实际上每个subshader可以理解为一套渲染方案,一个shader可以有多个渲染方案,每个渲染方案为针对不同的显卡而编写。
- Tags{} 是干什么的呢,代码长这样。
有一点我们需要知道,subshader里面的Tags只能在subshadr里面使用,pass里面的Tags只能在pass里面使用,我们现在说的是subshader里面的Tags。首先我们需要知道,默认情况下,Unity会基于对象距离摄像机的远近来排序你的对象。因此当一个对象离摄像机越近,它就会优先绘制在其它更远的对象上面。上面所述对于大多数情况这是适用的,可是在一些特殊情况下。你可能想要自己控制对象的绘制顺序。那么使用Tags{}块我们就能够得到这种控制。写法类似:
Tags{ “Queue” = “AlphaTest” “IgnoreProjector” = “True” }- Queue: 渲染顺序队列标签。指定使用本shader的物体的渲染顺序,Unity提供了以下几种预设,
其中还可以用Tags { “Queue”=“Geometry-20” }来表示,首先渲染BackGround,然后渲染Geometry-20,然后渲染Geometry,越先渲染越在下层,会被后渲染的遮挡。
注意: Geometry对应的队列值是2000,所以"Geometry-20"意味着使用队列值为1980的队列。而数值越小意味着越先被渲染,也就会被后面渲染的对象遮挡。
最后: 需要在SubShader块中声明ZWrite标签。意思是告诉Unity,我们想要重写对象的深度排序。而且我们将会为它指定一个新的渲染队列。所以我们设置 ZWrite Off
- IgnoreProjector:是否忽略投影的标签
- ForceNoShadowCasting=“True”:从不产生阴影的标签
- RenderType 这个标签主要是配合使用替换渲染,如果你不使用替换渲染,这个标签就没有多大意义,而且可以自定义RenderType的标签值,如:“RenderType”=“AAA”也是可行的,主要是起个归类的作用,下面有几种Unity预设的标签值:
- Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
- Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
- TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
- 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. 地形引擎何中的广告牌草。
- 接着上面的说RenderType的功能,替换渲染是什么? 代码:
Camera.SetReplacementShader(“AA(shader名字)”,“Opaque(RenderType)”)
意思是查找场景中所有shader,检查每个shader的RenderType值是否等于Opaque,如果相等,则替换为AAShader,如果不想等,则不渲染。如果RenderType为空字符串,则表示将场景中所有的物体都是用AAshader渲染。
- Queue: 渲染顺序队列标签。指定使用本shader的物体的渲染顺序,Unity提供了以下几种预设,
- Tags{} 是干什么的呢,代码长这样。
- LOD 200 Level of Detail。这里例子里我们指定了其为200。数值决定了我们能用什么样的 Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。Unity内建Shader定义了一组LOD的数值
- 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
- 下一篇会写到CGPROGRAM ENDCG 块的CG代码 Unity Shader 详细自学(三)