[Unity3D]关于U3D贴图格式压缩

http://blog.sina.com.cn/s/blog_5b6cb9500102vi6i.html

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

各种纹理格式,大家参照下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。玩家不注意到就可以了。

时间: 2024-10-16 21:01:37

[Unity3D]关于U3D贴图格式压缩的相关文章

崩坏学园2及大部分采用ETC1压缩格式的Unity3D游戏的拆包图处理

0x0 背景 众所周知(?) , 大部分(?)以Unity3D为引擎的手游为了进一步压缩资源大小, 在Android平台经常将贴图资源以ETC1格式压缩以减少体积. 蛋疼的是ETC1不支持Alpha通道.... 程序猿们选择将原图拆分, 用一张贴图来单独记录Alpha信息. 这就给后来的拆(偷)包(图)带来了不便(不要脸(*≧▽≦)), 怎么办呢? 合并回去就行了呀!(理直气壮) 0x1 实现 众...... 一张RGBA图片包含三个颜色通道以及一个Alpha通道, 经过拆分之后就变成了一张图片

Unity3D 批量修改贴图导入设置工具脚本

这个Unity3D 批量修改贴图导入设置工具脚本十分小巧,但是威力大.特别针对大批量贴图要调整尺寸等等的时候作用尤为明显.在菜单中添加"Custom→Texture"的方式来批量改变所选的贴图导入设置.Unity本身只能一次打开一张图片进行导入设置,目前这个脚本可以批量更改贴图格式,是否开启MipMap,调整纹理最大尺寸,是否可读等等. 用法是把脚本放在你项目的资源目录的Editor文件夹下.然后选择你要批处理的纹理.到菜单中选择要处理的类型就可以了.ChangeTextureImpo

用gulp-imageisux智图api压缩图片

? 智图平台是什么? 智图是腾讯ISUX前端团队开发的一个专门用于图片压缩和图片格式转换的平台,其功能包括针对png,jpeg,gif等各类格式图片的压缩,以及为上传图片自动选择最优的图片格式.同时,智图平台还会为用户转换一份webp格式的图片. ? 如何使用智图平台? 您只需要将要优化的图片拉至首页的拖拽区域后,系统会自动上传图片并经过智图压缩,返回新的图片.您也可以根据自己的实际使用情况选择不同的压缩率. ? 智图好在哪里? 智图能够自动为您选择压缩率压缩并且在合适的情况下为您选择正确的图片

Unity3D研究之asset bundle 格式简析详解

Unity3D 的 asset bundle 的格式并没有公开.但为了做更好的差异更新,我们还是希望了解其打包格式.这样可以制作专门的差异比较合并工具,会比直接做二进制差异比较效果好的多.因为可以把 asset bundle 内的数据拆分为独立单元,只对变更的单元做差异比较即可. 网上能查到的资料并不是官方给出的,最为流行的是一个叫做 disunity 的开源工具.它是用 java 编写的,只有源代码,而没有给出格式说明(而后者比代码重要的多).通过阅读 disunity 的代码,我整理出如下记

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩

Unity3D ShaderLab 使用贴图对模型的高光进行遮罩 前面研究了高光效果的实现,再说说现很多游戏用到的高光贴图技术,因为它可以让3D美工更容易控制最终的视觉效果. 这也就为我们提供了另外的方式,我们可以在同一个着色器上实现垫型表面和光亮表面,也可以使用贴图来控制镜面高光的范围或者高光强度, 以实现一个表面是广泛的镜面高光而另一面确是细小的高光. 新建一个shader,一个材质球.老规矩双击shader脚本,在编辑器中编写代码吧. 1.Properties: Properties {

Java对zip格式压缩和解压缩

Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格式),它的设计目标是处理单个的文件.gzip在压缩文件中的数据时使用的就是zlib.为了保存与文件属性有关的信息,gzip需要在压缩文件(*.gz)中保存更多的头信息内容,而zlib不用考虑这一点.但gzip只适用于单个文件,所以我们在UNIX/Linux上经常看到的压缩包后缀都是*.tar.gz或

Unity3D ShaderLab法线贴图

Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的多边形数.法线贴图通常存储在一个普通的rgb图片,他的rgb分量分别对应了曲面法线的xyz坐标. 在Unity中,会通过UnpackNormals()函数来使用法线贴图,这使得在表面着色范围内为我们的着色器添加使用法线的过程变得更容易. 首先,创建一个shader和材质球.我们开始修改shader代

node实现rar格式压缩

背景 由于公司的CMS系统里,只接受rar格式压缩的文件,所以没法直接使用nodejs里提供的zip压缩组件.只能从winRar软件入手了,但网上没有多少这方面相关的东西,所以下面也是自己尝试着在做. 主要解决的几个问题 rar软件的位置获取问题 通过node的命令行组件child_process,运行注册表查询命令REG query ‘键值名’,可以查找出相关软件的目录,然后使用正则表达式对结果进行匹配,返回软件目录.命令如下: var cp=require('child_process');

Java用ZIP格式压缩和解压缩文件

转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutputstream能够实现文件压缩,全部写入到zipoutputstream输入流中的数据,都会被ZIP格式压缩. 每一个被压缩的文件或者文件夹在zip文件里都相应一个zipentry对象,每一个zipentry都有一个name属性,表示它相对于zip文件文件夹的相对路径,对于文件夹,路径以“/“结尾,对