贴图压缩格式

因为有不少人都问过我压缩格式的问题,今天飞哥又重新提醒了一次。整理一下发个贴,以供大家查阅和讨论。

各种纹理格式,大家参照下U3D MANUAL里面的具体描述介绍,这是官方的东西。但我觉得有一部内容是错的,例如占用内存大小。

http://docs.unity3d.com/Manual/class-TextureImporter.html

基本知识点:

DXT格式是Nvidia Tegra提供的,ETC是安卓原生支持的,OPNEGL2.0都支持。ETC2只有OPENGL3.0支持,PVRTC是Imagination PowerVR提供的,ATC是Qualcomm Snapdragon提供的。一般来说,IOS只支持PVRTC的压缩格式。一旦相应的贴图格式不兼容的时候,U3D会自动将其转换成RGB(A)格式。最好的兼容是针对GPU进行打包,例如针对小米的都用ATC格式,但一般开发做不到太细化的选择。所有设备对RGB 16BITS/ARGB 16BITS/RGB A16BITS/RGB 24BITS/ARGB 32BITS等支持都很好,只是这些格式算是非压缩格式,对内存消耗和渲染消耗非常不友好。

关于压缩后的在储存上的大小,假设高清(ARGB32)大小为1,那么大概数据如下:

RGB PVRTC 4BITS:0.25

ARGB PVRTC 4BITS:0.25

RGB PVRTC 2BITS:0.13

ARGB PVRTC 2BITS:0.13

RGBA ETC2 4BITS:0.25

RGBA ETC2 8BITS:0.25

RGB + 1-bit ALPHA ETC2 8BITS:0.2

DXT1 :0.3

DXT5 : 0.6

ARGB 16BITS:0.33

RGB 16BITS:0.5

RGB 24BITS:0.85

ARGB 32BITS:1

当然每个都是根据图片不一样而不一样的,以上只是大致数据并非准确数据。

测试方法:单独为改为这样贴图格式的文件打成ASSETBUNDLE看大小。

对此抱有比较大疑问的是ARGB 16 和RGB 16,感觉可能这里U3D的BUNDLE有BUG。

内存中的大小,假设高清(ARGB32)大小为1,那么大概数据如下:

RGB PVRTC 2BITS:0.0625

ARGB PVRTC 2BITS:0.0625

RGB PVRTC 4BITS:0.125

ARGB PVRTC 4BITS:0.125

RGBA ETC2 4BITS:0.125

RGBA ETC2 8BITS:0.25

RGB + 1-bit ALPHA ETC2 8BITS:0.125

DXT1 :0.125

DXT5 : 0.25

ARGB 16BITS:0.5

RGB 16BITS:0.5

RGB 24BITS:0.8

ARGB 32BITS:1

 

建议如下:

一般来说3D游戏我们压缩贴图的时候会把贴图分为UI贴图和场景模型贴图来考虑,主要是因为有多重采样的缘故。3D游戏一般来说都是受摄像机远近大小改变而采取不同的采样大小,假设不设置多重纹理采样的话,在远处会有非常多的白色噪点。

2D游戏的话,所有都不需要勾选多重采样,具有3D性质的贴图,我们都需要勾选上GENERATE MIP MAPS,这样会使贴图大小增加25%这样。

正方贴图与非正方贴图也要区分。非正方贴图只有16位的压缩(相当于真彩色减半),所以最好游戏中都是正方的贴图。以下是个人选择贴图压缩格式遵循的一些规则,大家可以参考下,若有问题可以一起交流一下。

正方贴图:

IOS下:

a.普通不透明:RGB PVRTC 4BITS

b.普通透明:RGBA PVRTC 4BITS

Android下:

a.普通不透明:RGB ETC 4BITS

b.普通透明:

因为没有通用最兼容的格式,所以一般情况是用RGBA 16BIT或有针对性的选择DXT5/ATC8 BITS/ETC2 8BITS。如果有技术支持,可以采用RGB ETC 4BITS加一张ALPHA 8的贴图来实现透明效果。

非正方贴图:

一般采用16位压缩,16位会带来颜色损失,但如果本来美术就是按16BITS画的话,就不会损失,日本好些手游都是按16BITS来画的。这样的游戏一般少渐变艳度高比较容易看出来。

a.不透明贴图: RGB 16BITS

d.透明贴图:RGBA 16BITS

高清不压缩贴图:

RGBA 32BIT

另外:

对于不重要的贴图,模糊度低的贴图,建议不仅要采取像素压缩,还要直接压缩其大小。如光照贴图压到512或256。如背景原本1024的图直接压到256。玩家不注意到就可以了。

 

### 如何在 Unity 2019 中设置光照贴图压缩格式 在 Unity 2019 中,光照贴图压缩格式取决于所选的质量级别以及目标平台的支持情况。以下是关于如何配置光照贴图压缩格式的相关信息: #### 光照贴图质量级别的影响 Unity 提供了三种光照贴图质量设置:High Quality、Normal Quality 和 Low Quality。这些设置直接影响生成的光照贴图格式及其存储方式。 - **High Quality**: 当选择此模式时,生成的光照贴图将以浮点型 HDR 贴图的形式保存,在 Windows 平台上通常采用 BC6H 压缩格式(Direct3D11 支持的一种高效压缩方案)[^1]。 - **Normal Quality**: 此模式下的光照贴图会被编码为 RGBM 格式的 32 位贴图,适用于大多数现代设备并提供良好的性能平衡。 - **Low Quality**: 对于资源受限的情况,可以选择该选项以减少内存占用;在这种情况下,光照贴图将作为 DLDR 编码的 32 位贴图生成。 #### 针对不同平台的纹理压缩行为 除了全局质量设定外,实际使用的压缩算法还受到目标运行环境的影响。例如: - 在 Android 设备上: - 如果光照贴图无透明通道,则优先尝试 ETC1 压缩; - 若存在 Alpha 通道则切换至更高级别的 ETC2 或 RGBA32 (如果分辨率不符合标准)[^2]。 - 对应 iOS 的处理逻辑类似但有所区别——主要依赖 PowerVR Texture Compression(PVRTC),即分别针对有无Alpha决定是否启用RGBA版本还是基础版RGB形式,并同样具备回退机制以防异常状况发生[^2]。 #### 实际操作指南 为了手动调整上述特性,开发者可以通过以下途径实现自定义控制: 1. 开启烘焙流程前确认当前项目的`Quality Settings`已适配预期需求(可通过Edit->ProjectSettings->Quality访问)。 2. 进入具体场景编辑状态后执行 baking 操作之前务必指定恰当的 lighting preset 文件(`Lighting -> Scene -> New Lighting Settings`)以便记录相关偏好项[^3]. 3. 利用 `Window -> Rendering -> Light Transport` 界面进一步微调涉及对象属性比如间接光强度贡献比例等细节参数[^4],尽管这部分更多关联渲染效果而非单纯文件规格转换过程. 最后值得注意的一点在于官方文档里提到过有关各操作系统兼容性的考量因素列表可供查阅参考[^5],从而帮助我们更好地理解整个生态系统内部运作原理的同时也能做出更加明智的技术决策. ```csharp // 示例代码展示如何通过脚本动态修改光照贴图品质等级 using UnityEngine; public class SetLightmapResolution : MonoBehaviour { void Start() { LightmapEditorSettings.lightmapsBakeMode = LightmapsBakeMode.Baked; // 设置烘培模式为 Baked } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值