内容说明
ShaderLOD的说明。(不是模型的LOD)
1. 着色器的LOD(Level ofdetail)是用在整个shader或者SubShader中。当LOD的值小于设定值时,相应的shader不会工作。
默认情况下,允许的 LOD 级别可以是无限的。也就是说,可以使用硬件所支持的所有的着色器。然而,在某些情况下即使硬件可以支持它们,你可能也要放弃着色器的详细信息。例如,一些廉价的图形卡可能支持所有功能,但使用这些功能的速度太慢了。所以,你可能就不想在这些卡上使用视差法线映射了。
着色器的细节层次既可以针对单个着色器进行设定(使用Shader.maximumLOD),也可以针对所有着色器进行全局设定(使用Shader.globalMaximumLOD)。
在你的自定义着色器中,使用LOD命令来为每个子着色器来设定LOD值。
Unity中内建的着色器的LOD设置参数如下:
- VertexLit kind of shaders = 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. 我们来看个例子
[C#] 纯文本查看 复制代码
Shader "Unlit/Test"{ Properties { _Color ("Main Color", Color) = (1,1,1,0.5) _MainTex ("Base (RGB)", 2D) = "white" { } } SubShader { LOD 600 Pass { Material { Diffuse (0,1,0,1)} Lighting On SetTexture [_MainTex] {Combine texture * primary double} } } SubShader { LOD 500 Pass { Material {Diffuse (1,1,0,1)} Lighting On } } SubShader { LOD 400 Pass { color(1,0,0,1) } }} |
我们通过代码更该shader的LOD
[C#] 纯文本查看 复制代码
using UnityEngine;using System.Collections;public class ChangeShaderLOD : MonoBehaviour { public Shader myShader; void OnGUI() { if(GUI.Button(new Rect(10,20,200,50),"shader 600")) { myShader.maximumLOD = 600; } if (GUI.Button(new Rect(215, 20, 200, 50), "shader 500")) { myShader.maximumLOD = 500; } if (GUI.Button(new Rect(420, 20, 200, 50), "shader 400")) { myShader.maximumLOD = 400; } if (GUI.Button(new Rect(625, 20, 200, 50), "shader 300")) { myShader.maximumLOD = 300; } }} |
可以看下各个LOD的效果
LOD 600
LOD 500
LOD 400
3. 我们在看下全局的LOD设置
我们在copy一份一样的材质和shader,把C#代码更改下。
[C#] 纯文本查看 复制代码
using UnityEngine;using System.Collections;public class ChangeShaderLOD : MonoBehaviour { public Shader myShader; void OnGUI() { if(GUI.Button(new Rect(10,20,200,50),"shader 600")) { myShader.maximumLOD = 600; } if (GUI.Button(new Rect(215, 20, 200, 50), "shader 500")) { myShader.maximumLOD = 500; } if (GUI.Button(new Rect(420, 20, 200, 50), "shader 400")) { myShader.maximumLOD = 400; } if (GUI.Button(new Rect(625, 20, 200, 50), "shader 300")) { myShader.maximumLOD = 300; } if (GUI.Button(new Rect(10, 80, 200, 50), "global 600")) { //myShader.maximumLOD = -1; Shader.globalMaximumLOD = 600; } if (GUI.Button(new Rect(215, 80, 200, 50), "global 500")) { //myShader.maximumLOD = -1; Shader.globalMaximumLOD = 500; } if (GUI.Button(new Rect(420, 80 , 200, 50), "global 400")) { //myShader.maximumLOD = -1; Shader.globalMaximumLOD = 400; } if (GUI.Button(new Rect(625, 80, 200, 50), "global 300")) { // myShader.maximumLOD = -1; Shader.globalMaximumLOD = 300; } }} |
我们会发现如果你不更改shader的maximumLOD属性,这个属性随全局变换。如果更改后就会按自己的lod值。要想让shader的LOD属性再次使用全局的,就需要把shader的maximumLOD属性赋值为-1。
一般来说,游戏中有调节游戏品质的选项,就可以使用该方案关闭一部效果。