ShaderLab LOD 如何使用?
先要有两个数值的使用:
- 设置 Shader.globalMaximumLOD - 设置 shader 全局使用的最大的 LOD 值
- 设置 ShaderLab LOD 值 - 定位该 SubShader 所属的 LOD 级别
Shader.globalMaximumLOD API 可以通过 C# 脚本获取或设置
当:Shader.globalMaximumLOD >= ShaderLab Subshader 中某个(从上往下遍历,unity 内置的黑箱操作) LOD 时,就会使用该 SubShader 作为着色器
如:
Shader.globalMaximumLOD = 200;
ShaderLab:
Shader "Test"
{
SubShader
{
LOD 200
}
SubShader
{
LOD 100
}
}
那么 unity 引擎渲染前会使用 SubShader LOD 200 的 shader
因为 Shader.globalMaximumLOD >= SubShader LOD 200 (The Top LOD of SubShader)
Example
CSharp
// jave.lin 2021/06/07
// 测试 unity ShaderLab LOD 的用法
using UnityEngine;
using UnityEngine.UI;
public class TestingSubShaderLOD : MonoBehaviour
{
public Dropdown dropdown;
private int[] dropdownLODArr;
public void Start()
{
dropdownLODArr = new int[3] { 200, 100, 99 /** 或小于 ShaderLab 中 LOD 最低的值都可以 */ };
ApplyShaderLODChanged(dropdown.value);
}
public void OnShaderLODChanged(int index)
{
ApplyShaderLODChanged(index);
}
private void ApplyShaderLODChanged(int index)
{
var srcLOD = Shader.globalMaximumLOD;
var newLOD = dropdownLODArr[index];
Shader.globalMaximumLOD = newLOD;
Debug.Log($"ApplyShaderLODChanged index : {index}, src : {srcLOD}, new : {newLOD}");
}
}
Shader
// jave.lin 2021/06/06
// 测试 Unity ShaderLab SubShader LOD
Shader "Test/TestingSubShaderLOD"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_LOD200Color ("LOD 200 TintColor", Color) = (0, 1, 0, 1)
_LOD100Color ("LOD 100 TintColor", Color) = (1, 0, 0, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200 // 越大的 LOD 值,放越前面
Pass
{
Name "LOD200" // 便于 frame debugger 调试用
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _LOD200Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col * _LOD200Color;
}
ENDCG
}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100 // 越大的 LOD 值,放越后面
Pass
{
Name "LOD100" // 便于 frame debugger 调试用
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _LOD100Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col * _LOD100Color;
}
ENDCG
}
}
}
运行效果
Project
TestingSubShaderLOD_unity 2019.4.0f1 提取码: dc8g