unity3d着色器详细级别

unity3d着色器详细级别,unity3d,glsl,shader,hlsl,Unity3d,Glsl,Shader,Hlsl,可能问题看起来很奇怪,但是,请查看下面列出的总结着色器代码: Shader "AngryBots/PlanarRealtimeReflection" { Properties { ... } SubShader { LOD 400 Tags { "RenderType"="Opaque" } Fog { Mode Off } Pass { ...

可能问题看起来很奇怪,但是,请查看下面列出的总结着色器代码:

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手册,它告诉我,例如,PC的BumpedMapDiffuse着色器是500!但如何将其转换为移动设备

当您需要支持一系列具有不同性能的GPU时,着色器LOD非常有用。例如,如果您希望您的游戏在iPhone4和iPhone5S上都能顺利运行


通常的做法是将着色器组合为一组具有不同LOD的多个子着色器(将它们视为同一着色器的一个版本)。可以在具有较大LOD的子着色器中实现复杂的逐像素照明,在具有较小LOD的子着色器中实现粗糙的逐顶点照明。然后,您可以使用

在代码中启用适当版本的着色器。当您需要支持一系列具有不同性能的GPU时,着色器LOD非常有用。例如,如果您希望您的游戏在iPhone4和iPhone5S上都能顺利运行


通常的做法是将着色器组合为一组具有不同LOD的多个子着色器(将它们视为同一着色器的一个版本)。可以在具有较大LOD的子着色器中实现复杂的逐像素照明,在具有较小LOD的子着色器中实现粗糙的逐顶点照明。然后,您可以使用Unity的ShaderLab详细级别(LOD)*在代码中启用适当版本的着色器,这是一个方便的功能,可帮助开发人员在单个着色器中支持多个平台。基本思想是,应用程序可能有一个只在PC上工作的
SweetLightingShader
。假设iPad不支持
SweetLightingShader
,但它支持
SemiSweetLightingShader
。您可以维护两个单独的着色器,或者更好地将它们合并到单个着色器中,并使用LOD来决定要使用的功能

*不要将ShaderLab LOD与几何LOD混淆,它们是独立的主题

下面是一个具有两个详细级别的着色器示例:

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要求的第一个子阴影是使用的子阴影。从:

当Unity渲染着色器时,它将覆盖所有子着色器并使用 硬件支持的第一个

请注意有关
着色器.globalMaximumLOD
的文档说明它是所有着色器的
着色器LOD级别。
这似乎不是直接正确的,这就是我的示例直接为着色器设置LOD的原因。Unity附带的AngryBots演示使用以下片段将全局最大LOD应用于所有着色器:

Shader.globalMaximumLOD = quality;
for (var s : Shader in shaders.shaders) {
    s.maximumLOD = quality;    
}

Unity的ShaderLab细节级别(LOD)*为开发人员提供了方便的功能,帮助他们在单个着色器中支持多个平台。基本思想是,应用程序可能有一个只在PC上工作的
SweetLightingShader
。假设iPad不支持
SweetLightingShader
,但它支持
SemiSweetLightingShader
。您可以维护两个单独的着色器,或者更好地将它们合并到单个着色器中,并使用LOD来决定要使用的功能

*不要将ShaderLab LOD与几何LOD混淆,它们是独立的主题

下面是一个具有两个详细级别的着色器示例:

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要求的第一个子阴影是使用的子阴影。从:

当Unity渲染着色器时,它将覆盖所有子着色器并使用 硬件支持的第一个

请注意有关
着色器.globalMaximumLOD
的文档说明它是所有着色器的
着色器LOD级别。
这似乎不是直接正确的,这就是我的示例直接为着色器设置LOD的原因。Unity附带的AngryBots演示使用以下片段将全局最大LOD应用于所有着色器:

Shader.globalMaximumLOD = quality;
for (var s : Shader in shaders.shaders) {
    s.maximumLOD = quality;    
}

将LOD视为手动过滤。它不会释放任何额外的潜力或提供更多的细节,它只是一种手动禁用某些着色器的方法,如果你知道你处于一个受约束的环境中,如iPad与PC。更改允许的LOD由你完成,没有幕后alg。你想告诉我GPU根本不能与它们一起工作吗?我应该写一些脚本并手动控制它们吗?那么,他们的职责是什么?我可以使用shader.isSupported属性!将LOD视为手动过滤。它不会释放任何额外的潜力或提供更多的细节,它只是一种手动禁用某些着色器的方法,如果你知道你处于一个受约束的环境中,如iPad与PC。更改允许的LOD由你完成,没有幕后alg。你想告诉我GPU根本不能与它们一起工作吗?我应该写一些脚本并手动控制它们吗?那么,他们的职责是什么?我可以使用shader.isSupported属性!