zoukankan      html  css  js  c++  java
  • 关于U3D贴图格式压缩

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

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

  • 相关阅读:
    终端操作各插件安装配置
    浅谈CSRF攻击方式
    教你突破基于HTTP_REFERER的防盗链的方法
    HTTP Referer简介
    如何利用百度蜘蛛referer找到报错页面入口?
    Flex 布局教程:语法
    HTTP 状态码
    RESTful API 设计最佳实践
    Javascript原型和原型链
    JS判断是什么设备是什么浏览器-主要用移动页面开发
  • 原文地址:https://www.cnblogs.com/lancidie/p/14101096.html
Copyright © 2011-2022 走看看