【问题标题】:unity3d shaders level of detailunity3d 着色器细节层次
【发布时间】:2014-08-08 19:18:39
【问题描述】:

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

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

【问题讨论】:

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

标签: unity3d glsl shader hlsl


【解决方案1】:

Unity 的 ShaderLab 细节层次 (LOD)* 是一项方便开发人员的功能,可帮助他们在单个着色器中支持多个平台。基本思想是,一个应用程序可能有一个仅适用于 PC 的SweetLightingShader。假设 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 演示使用以下 sn-p 将全局最大 LOD 应用于所有着色器:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2013-12-06
      • 2011-05-26
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      相关资源
      最近更新 更多