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

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

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

  • 相关阅读:
    Python 安装Twisted 提示python version 2.7 required,which was not found in the registry
    Openfire Strophe开发中文乱码问题
    css div 垂直居中
    How to create custom methods for use in spring security expression language annotations
    How to check “hasRole” in Java Code with Spring Security?
    Android 显示/隐藏 应用图标
    Android 当媒体变更后,通知其他应用重新扫描
    文件上传那些事儿
    专题:点滴Javascript
    主流动画实现方式总结
  • 原文地址:https://www.cnblogs.com/softimagewht/p/4807304.html
Copyright © 2011-2022 走看看