unity shaderlab中lod的作用

内容说明
         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。
一般来说,游戏中有调节游戏品质的选项,就可以使用该方案关闭一部效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章