也许问题似乎很奇怪,但是,请查看下面列出的汇总着色器代码:
Shader "AngryBots/PlanarRealtimeReflection" {
Properties {
...
}
SubShader {
LOD 400
Tags { "RenderType"="Opaque" }
Fog { Mode Off }
Pass {
...
}
}
SubShader {
LOD 200
Tags { "RenderType"="Opaque" }
Fog { Mode Off }
Pass {
....
}
}
}
每个子着色器都有不同的LOD,我知道更大的LOD有更多的细节,想要更多的GPU处理,那么我们应该如何编号着色器的LOD?设备GPU如何理解数字!
那么我如何才能发现我的着色器LOD为500或700或300?
我读过unity3d手册,它告诉我例如BumpedMapDiffuse Shader For PC是500!但是如何将其转换为移动设备?
答案 0 :(得分:2)
Unity的ShaderLab详细程度(LOD)*是开发人员的便利功能,可帮助他们在单个着色器中支持多个平台。基本思想是应用程序可能只有SweetLightingShader
才能在PC上运行。假设iPad不支持SweetLightingShader
,但它确实支持SemiSweetLightingShader
。您可以维护两个单独的着色器,或者更好的是,将它们合并到一个着色器中,并使用LOD来决定使用哪种功能。
*不要将ShaderLab LOD与几何LOD混淆,它们是独立的主题。
以下是一个具有2个细节级别的示例着色器:
Shader "Custom/ExampleLighting" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader { // SweetLighting
LOD 200
Pass { Color (1,0,0,0) }
}
SubShader { // SemiSweetLighting
LOD 100
Pass { Color (0,1,0,0) }
}
FallBack "Diffuse"
}
可以像这样设置LOD:
public class SwitchLod : MonoBehaviour {
public Shader myShader;
void Start() {
myShader.maximumLOD = 100; //Use SemiSweetLighting -or-
myShader.maximumLOD = 200; //Use SweetLighting
}
}
满足LOD要求的第一个子载体是使用的子载体。来自docs:
当Unity呈现着色器时,它将遍历所有子着色器并使用 硬件支持的第一个。
注意,Shader.globalMaximumLOD
的文档声明它是Shader LOD level for all shaders.
这似乎不是直接为真,这就是我的示例直接为着色器设置LOD的原因。 Unity附带的AngryBots演示使用以下代码段将全局最大LOD应用于所有着色器:
Shader.globalMaximumLOD = quality;
for (var s : Shader in shaders.shaders) {
s.maximumLOD = quality;
}
答案 1 :(得分:1)
当您需要支持一系列具有不同性能的GPU时,Shader LOD非常有用。例如,如果您希望您的游戏在iPhone4和iPhone5S上顺利运行。
通常的做法是将着色器组合为一组具有不同LOD的几个子着色器(将它们视为同一着色器的版本)。您可以在具有较大LOD的子着色器中实现复杂的每像素照明,并在具有较小LOD的那些中实现粗略的每顶点照明。然后,您可以使用Shader.globalMaximumLOD
在代码中启用适当版本的着色器