Unity 可存储采用不同压缩和编码方案的光照贴图,具体取决于目标平台以及 Lighting 窗口中的压缩设置。
Unity 项目可以使用两种技术在必要时将烘焙光源强度范围编码为低动态范围纹理:
RGBM 编码。RGBM 编码将颜色存储在 RGB 通道中,将乘数 (M) 存储在 Alpha 通道中。在线性空间中,RGBM 光照贴图的范围是 0 到 34.49(52.2),而在伽马空间中,范围是 0 到 5。
双低动态范围 (dLDR) 编码。只需直接将 [0, 2] 范围映射到 [0, 1],即可在移动平台上使用 dLDR 编码。值高于 2 的烘焙光源强度将被钳制。编码值的计算方法是:光照贴图纹理的值乘以 2(如果使用伽马空间),或乘以 4.59482(22.2)(如果使用线性空间)。某些平台将光照贴图存储为 dLDR,这是因为在使用 RGBM 时,这些平台的硬件压缩会产生外观不佳的瑕疵。
使用线性颜色空间时,光照贴图纹理将标记为 sRGB,着色器使用的最终值(采样和解码后)将位于线性颜色空间中。使用伽马颜色空间时,最终值将在伽马颜色空间中。
注意:使用编码时,存储在光照贴图(GPU 纹理内存)中的值始终位于伽马颜色空间中。
UnityCG.cginc 着色器 include 文件中的 Decode Lightmap 着色器函数负责在从着色器中的光照贴图纹理读取值之后解码光照贴图值。
You can use HDR lightmaps on Windows, Mac, Linux, iOS, tvOS, and Android. To control the encoding/compression of the lightmaps for these platforms, go to Edit > Project Settings > Player > Other Settings > Lightmap Encoding.
Choosing High Quality will enable HDR lightmap support, whereas Normal Quality will switch to using RGBM encoding. Low Quality will switch to dLDR encoding on mobile platforms, on other platforms it’s equivalent to Normal Quality.
在桌面平台和游戏主机平台上,Lighting 窗口中启用了光照贴图 Compression 时,将使用 BC6H 压缩格式来压缩光照贴图。对于移动平台,Unity 根据下表选择 HDR 格式。
HDR 光照贴图不使用任何编码方案来编码光照贴图值,因此支持的范围仅受到 16 位浮点纹理格式的限制(范围从 0 到 65504)。
BC6H 格式质量优于 DXT5 + RGBM 格式编码,并且不会产生 RGBM 编码所具有的任何色带瑕疵。
需要对 HDR 光照贴图进行采样的着色器是一些较短的 ALU 指令,因为不需要对采样值进行解码。
BC6H 格式与 DXT5 具有相同的 GPU 内存要求。
以下列表列出了每个目标平台的编码方案及其纹理压缩格式:
目标平台 | 编码 | 压缩 - 大小(每像素位数) |
---|---|---|
独立平台(PC、Mac 和 Linux) | RGBM / HDR | DXT5 / BC6H - 8 bpp |
Xbox One | RGBM / HDR | DXT5 / BC6H - 8 bpp |
PlayStation4 | RGBM / HDR | DXT5 / BC6H - 8 bpp |
WebGL 1.0 / 2.0 | RGBM | DXT5 - 8 bpp |
iOS | dLDR / RGBM / HDR | PVRTC RGB - 4 bpp / ETC2 RGBA - 8 bpp / RGB9E5 - 32 bpp |
tvOS | dLDR / RGBM / HDR | ASTC - 3.56 bpp / ASTC - 3.56 bpp / RGB9E5 - 32 bpp |
Android* | dLDR / RGBM / HDR | ETC1 RGB - 4 bpp / ETC2 RGBA - 8 bpp / ASTC HDR - 3.56 bpp |
*如果目标平台是 Android__,则可将 Build Settings__ 中的默认纹理压缩格式改写为以下格式之一:DXT1、PVRTC、ETC2 或 ASTC。RGB 纹理的默认格式为 ETC,而 RGBA 纹理的默认格式为 ETC2。
The inputs to the GI system have a different range and encoding to the output. Surface albedo is 8-bit unsigned integer RGB in gamma space and emission is 16-bit floating point RGB in linear space. For advice on providing custom inputs using a meta pass, see documentation on Lightmapping and shaders.
辐照度输出纹理将以 RGB9E5 共享指数浮点格式(如果图形硬件支持此格式)存储,或者以范围在 5 以内的 RGBM 作为后备格式。RGB9E5 光照贴图的范围是 [0, 65408]。有关 RGB9E5 格式的详细信息,请参阅 Khronos.org:EXT_texture_shared_exponent。
另请参阅: