unity3d着色器详细程度

时间:2014-08-08 19:18:40

标签: unity3d glsl shader hlsl

也许问题似乎很奇怪,但是,请查看下面列出的汇总着色器代码:

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!但是如何将其转换为移动设备?

2 个答案:

答案 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

在代码中启用适当版本的着色器