LOD
LOD(Level of Detail),如LOD 200,即指定了其为200(其实这是Unity的内建Diffuse着色器的设定值)。这个数值决定了我们能用什么样的Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。Unity内建Shader定义了一组LOD的数值,我们在实现自己的Shader的时候可以将其作为参考来设定自己的LOD数值,这样在之后调整根据设备图形性能来调整画质时可以进行比较精确的控制。
Unity中内建的着色器的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
Cull 设置剔除模式
官方文档:https://docs.unity3d.com/Manual/SL-CullAndDepth.html
Cull Back|Front|Off 剔除背面|正面|关闭剔除
- Cull Back
unity默认选择cull back,对于 平面来说 就是只有正面看到,反面看过去是穿透什么都没有;对于 正方体 来说 就是只有 从正方体外面能看到东西, 从正方体内部往外看是什么都看不到 - Cull Off
就是同时渲染正反面 ,平面是两边都可以看到,正方体也是内外都可以看到 - Cull Front
对于平面来说 只看到平面的反面,对于正方体来说 从外面能看到 对着镜头的面 ,看不到反着镜头的面
ZTest 深度测试时使用的函数
官方文档:https://docs.unity3d.com/Manual/SL-CullAndDepth.html
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always|Never|On|Off
默认是LEqual(小于等于),当物体的这个像素的Z值小于等于当前摄像机在这个像素上的Z值,则通过Ztest。
- Always,Ztest永远通过
- Never,Ztest永远不通过
- Off,等同于 ZTest Always
- On,等同于ZTest LEqual
- 其它略
如果想节省GPU的时间,就要在渲染之前计算一次渲染顺序,这样在Ztest之后就,被遮挡的部分就不会进入fragment shader;反之想要解放CPU的负担,就不要对渲染物体进行排序(排序这个东西大家都懂的)。当然这样会多次渲染被遮挡的像素。
ZWrite 开启/关闭深度写入
官方文档:https://docs.unity3d.com/Manual/SL-CullAndDepth.html
ZWrite On/Off
默认是Zwrite On
Zwrite是否更新摄像机在当前像素上的z值,根据两个条件:
- 是否允许进行Zwrite
- Ztest是否通过
如果ZTest通过,Zwrite off的情况下,只写入像素值,不更新像素的Z值。
Blend 开启并设置混合模式
官方文档:https://docs.unity3d.com/Manual/SL-Blend.html
混合命令:
- Blend Off:
关闭混合(默认) - Blend SrcFactor DstFactor:
最终颜色 = Shader计算出来的颜色值(fragment_output)* 源系数 + 点积累颜色值(pixel_color)* 目标系数
Blend最后产生的值对透明度没有影响,虽然result包含透明度的值,但是最终呈现到屏幕后Alpha会被舍弃。 - Blend SrcFactor DstFactor,SrcFactorA DstFactorA:
同上,只不过使用单独的因子SrcFactorA和DstFactorA来混合透明度通道 - BlendOp Op:
用其他的操作来取代加法混合 - BlendOp OpColor,OpAlpha
同上,只不过对于透明度通道使用不同的操作
BlendOp
-Add:加法,SrcFactor * fragment_output + DstFactor * pixel_color
-Sub:减法( 源-目标),SrcFactor * fragment_output - DstFactor * pixel_color
-RevSub:减法(目标-源),DstFactor * pixel_color - SrcFactor * fragment_output
-Min:较小值(逐个通道比较)
-Max:较大值(逐个通道比较)
Blend factors
Blend factors中任一个Factor即做为SrcFactor,也可以做为DstFactor。
- One:float4(1.0, 1.0, 1.0, 1.0)
- Zero:float4(0.0, 0.0, 0.0, 0.0)
- SrcColor:fragment_output
- SrcAlpha:fragment_output.aaaa
- DstColor:pixel_color
- DstAlpha:pixel_color.aaaa
- OneMinusSrcColor:float4(1.0, 1.0, 1.0, 1.0) - fragment_output
- OneMinusSrcAlpha:float4(1.0, 1.0, 1.0, 1.0) - fragment_output.aaaa
- OneMinusDstColor:float4(1.0, 1.0, 1.0, 1.0) - pixel_color
- OneMinusDstAlpha:float4(1.0, 1.0, 1.0, 1.0) - pixel_color.aaaa
常用的混合命令有:
- Blend SrcAlpha OneMinusSrcAlpha // 传统透明度
- Blend One OneMinusSrcAlpha // 预乘透明度
- Blend One One // 叠加
- Blend OneMinusDstColor One // 柔和叠加
- Blend DstColor Zero // 相乘——正片叠底
- Blend DstColor SrcColor // 两倍相乘
Example
Blend SrcAlpha One
result=fragment_output.aaaa*fragment_output.rgba+float4(1,1,1,1)*pixel_color
result=fragment_output(a*r,a*g,a*b,a*a)+pixel_color
网友评论