设置LOD值

视频截图

  1. LOD Level of Detail,根据LOD来设置使用不同版本的Shader;
  2. 着色器中给SubShader一个LOD值,程序来设置这个shader的LOD值,只有第一个小于等于LOD值subShader才会被执行;
  3. 每个shader最多只会有一个Subshader被使用;
  4. 通过Shader maximumLOD来设置最大的LOD值;
  5. 设置全局的LOD值,Shader.globalMaximumLOD;
  6. Unity内置着色器分LOD等级:
  • (1)Vertexlit kind of shaders 100
  • (2)Decal,Reflective Vertexd.it 150
  • (3)Diffuse 200
  • (4)Difuse Detail 250
  • (5)Bumped,Specular 300
  • (6)BumpedSpecular 400
  • (7)Parallax 500
  • (8)Parallax Specular 600

渲染队列

视频截图

  1. 演染队列标签可选值:
  • (1)8ackground背景,对应的值为1000;
  • (2)Geometry(default)几何体对应的值为2000,这个队列是默认的渲染队列,大多数不透明的物体;
  • (3)AlphaTest Alpha测试,对应值为2450,alpha测试的几何体使用这种队列,它是独立于Geometry的队列,它> 可以在所有固体对象绘制后更有效的渲染采用Alpha测试的对象;
  • (4)Transparent透明,对应值3000,这个演染队列在Geometry被渲染,采用从后向前的次序;任何有alpha混合的> 对象都在这个队列里面渲染;
  • (5)Overlay 覆盖对应值为4000,这个道染队列是最后渲染的物体;
  1. Unity 演染模式:普通物体从前向后演染,Alpha从后向前演染
  2. 渲染队列的数值决定了Unity在渲染场景物体时的先后顺序,关闭深度测试的情况下;

混合模式

视频截图

  1. 在所有计算完成后,决定当前的计算结果输出到帧缓冲区时,如何混合源和目标,通常用来绘制半透明的物体;
  2. Blend Off关闭混合
  3. Blend源因子,目标因子:配置并开启混合,产生的颜色和源因子相乘,然后两个颜色相加
  4. Blend源因子,目标因子,源因子A,目标因子A:源因子与目标因子用户混合颜色值,源因子A,与目标因子A,用于混合alpha
  5. BlendOp操作命令:不是将颜色混合在一起,而是对他们进行操作,主要有:Min,Max,Sub,RevSub
  6. 混合因子的类型:
  • One使用源或目标色完全显示出来;
  • OneMinusSrcColor 阶段值*(1-源颜色的值)
  • Zero 删除源颜色或目标颜色;
  • One MinusSrcAlpha 阶段值*(1-源颜色的Alpha值)
  • SrcColor这个阶段的值*源颜色值;
  • OneMinusDstColor阶段值*(1-目标颜色的值;
  • DstColor这个阶段的值*帧缓冲颜色值;
  • OneMinusDstAlha阶段值*(1-目标颜色Alpha值)
  • DstAlpha这个阶段的值*帧缓冲源Alpha值
  1. 一般放在放在Pass通道里面

混合模式类似于 PS 的 blending mode

Alpha测试

视频截图

  1. Alpha测试:阻止片元被写到屏幕的最后机会,最终渲染出来的颜色计算出来后可通过透明度和最后一个固定值比较,如果通过测试则绘制次片元,否则丢弃此片元;
  2. Alpha Test Off/On:开启/关闭Alpha测试,默认是关闭的;
  3. 比较测试值的模式:
  • Greater >
  • GEqual>=
  • Less <
  • LEqual<=
  • Equal ==
  • NotEqual !=
  • Always(永远渲染)
  • Never(重不渲染)
  1. AlphaTest条件[变量],一般放在放在Pass通道里面;

深度测试

视频截图

  1. 为了使近距离的物体挡住远距离的物体,当片元写入到缓冲的时候,需要将片元的深度值与缓冲区的深度值进行比较,测试成功写入帧缓冲区;
  2. ZWrite深度写开关,控制是否将深度Z的片元写入缓冲区中,如果不绘制透明物体设置为On,否则的话设置为off,默认为On;
  3. ZTest深度测试模式:设置深度测试的执行方式,默认为LEqual,深度测试的模式:
  • Greater >
  • GEqual>=
  • Less <
  • LEqual<=
  • Equal ==
  • NotEqual !=
  • Always(永远渲染)
  1. ZTest条件
  2. 一般放在放在Pass通道里面;

通道遮罩

视频截图

  1. 通道遮罩可以是开发人员指定道染结果输出的通道,而不是通常情况下的RGBA四个通道;
  2. 可选的是RGBA的任意组合以及0,如果为0意味着不会写入到任何通道;
  3. ColorMask RG … ColorMask 0

面剔除

视频截图

  1. 通过不渲染背对摄像机的几何体的面来提高性能优化错误,所有的几何体都包含正面和反面
  2. 面剔除操作,大多数都是封闭的物体,所以不需要绘制背面;
  3. 面剔除操作:
  • Cull Back:不绘制背对摄像机的面,默认项
  • Cull Front,不绘制面向摄像机的面
  • Cull off,关闭面剔除操作

混合模式案例

效果截图



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Shader "Custom/BlendShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color", Color) = (1.0,0.0,0.0,1.0)

}
SubShader
{
Tags { "RenderType"="Opaque" "Queue" = "Transparent+1" }
LOD 100

Pass
{
// 添加alpha混合模式
Blend SrcAlpha OneMinusSrcAlpha

CGPROGRAM
#pragma vertex vert
#pragma fragment frag


#include "UnityCG.cginc"


struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};

sampler2D _MainTex;
float4 _MainTex_ST;

v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}

fixed4 _Color;
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = _Color;
return col;
}
ENDCG
}
}
}


通道遮罩

效果截图

  只输出红色通道



1
2
3
4
5
6
7
8
9
10
11
12
Shader "Custom/ColorMaskShader"
{
SubShader
{
pass{
ColorMask R
Color(1.0,1.0,1.0,1.0)
}
}
FallBack "Diffuse"
}