Shader——LOD和渲染队列
LOD:level of detail
在一个shader中会有不止一个subshader,但是最多只有一个会被执行(如果所有subshader都不被执行,则执行默认)
每个shader都有一个LOD的值,而每个subshader对应一个LOD值,从上到下,当且仅当第一个subshader的LOD值小于等于该shader的LOD值,该subshader就会被执行,其他不执行
通过Shader maximumLOD来设置最大的LOD值
设置全局的LOD值,Shader.globalMaximumLOD
unity内置的着色器等级
- VertexLit kind of shaders 100
- Decal,Reflective VertexLit 150
- Deffuse 200
- Defuse Detail 250
- Bumped,Specular 300
- BumpedSpecular 400
- Parallax 500
- ParallaxSpecular 600
实际中通过代码控制shader的LOD最大值来确定shader执行哪一个subshader
RenderQueue
默认情况下,Unity会基于对象距离摄像机的远近来排序你的对象。因此,当一个对象离摄像机越近,它就会优先绘制在其他更远的对象上面。对于大多数情况这是有效并合适的,但是在一些特殊情况下,你可能想要自己控制对象的绘制顺序。而使用Tags{}块我们就可以得到这样的控制。
Unity提供给我们一些默认的渲染队列,每一个对应一个唯一的值,来指导Unity绘制对象到屏幕上。这些内置的渲染队列被称为
Background, Geometry, AlphaTest, Transparent, Overlay。这些队列不是随便创建的,它们是为了让我们更容易地编写Shader并处理实时渲染的。

同时需在SubShader中显示声明ZWrite Off,通知Unity我们会重写物体的渲染深度排序。
对于3D物体,他们使用more渲染排序,3D物体一般为实体不透明,在渲染的时候,从前往后渲染,对于遮挡部分(完全遮挡)则没必要绘制。而对于透明的,就需要从后往前,使用混合模式。
深度缓冲
对于UI,默认为3000.对于有些特殊需求,特殊处理层级,NGUI:不仅仅可以通过Panel,Depth调整深度,还可以调整渲染队列RenderQueue
(3000-100,3000+100)数值越高显示越靠前
深度缓冲(depth buffer | z-buffer)决定哪些物体渲染在前面,哪些物体渲染在后面。基本思想:根据深度缓冲中的值来决定该片元距离摄像机的距离(开启深度测试的前提下),当渲染这个片元时,把它的深度值和已经存在在深度缓冲中的值进行比较(开启深度写入的前提下),如果它的值距离摄像机更远,说明这个片元不用渲染(有物体挡住了它),否则,这个片元应该覆盖掉颜色缓冲中的像素值,并把它的深度值写入深度缓冲中(开启深度写入的前提下)。
关于深度缓冲更详细的分析:https://blog.csdn.net/liyaxin2010/article/details/83382940
而要实现透明效果,第一种办法开启透明度测试(Alpha Test),但是这种无法得到真正的半透明混合;另一种是透明度混合(Alpha Blend)。

浙公网安备 33010602011771号