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。
一般來說,遊戲中有調節遊戲品質的選項,就可以使用該方案關閉一部效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章