各种移动GPU压缩纹理的使用方法

转自: http://www.cnblogs.com/luming1979/archive/2013/02/04.html

介绍了各种移动设备所使用的GPU,以及各个GPU所支持的压缩纹理的格式和使用方法。

1.
移动GPU大全


目前移动市场的GPU主要有四大厂商系列:

1
ImaginationTechnologiesPowerVRSGX系列


代表型号:PowerVRSGX 535PowerVRSGX 540PowerVRSGX 543MPPowerVRSGX 554MP
代表作 :AppleiPhone全系、iPad全系,三星I9000P3100


2Qualcomm(高通)Adreno系列


代表型号:Adreno200Adreno205Adreno220Adreno320
代表作 :HTCG10G14,小米12


3ARMMali系列


代表型号:Mali-400Mali-T604
代表作 :三星GalaxySIIGalaxySIIIGalaxyNote1GalaxyNote2(亚版)


4nVIDIA(英伟达)Tegra系列


2.压缩纹理的必要性
1
)首先要说一下图像文件格式和纹理格式的区别。
常用的图像文件格式有BMPTGAJPGGIFPNG等;
常用的纹理格式有R5G6B5A4R4G4B4A1R5G5B5R8G8B8,A8R8G8B8等。

  
文件格式是图像为了存储信息而使用的对信息的特殊编码方式,它存储在磁盘中,或者内存中,但是并不能被GPU所识别,因为以向量计算见长的GPU对于这些复杂的计算无能为力。这些文件格式当被游戏读入后,还是需要经过CPU解压成R5G6B5A4R4G4B4A1R5G5B5R8G8B8,A8R8G8B8等像素格式,再传送到GPU端进行使用。
  
纹理格式是能被GPU所识别的像素格式,能被快速寻址并采样。
举个例子,DDS文件是游戏开发中常用的文件格式,它内部可以包含A4R4G4B4的纹理格式,也可以包含A8R8G8B8的纹理格式,甚至可以包含DXT1的纹理格式。在这里DDS文件有点容器的意味。

   OpenGLES 2.0
支持以上提到的R5G6B5A4R4G4B4A1R5G5B5R8G8B8A8R8G8B8等纹理格式,其中R5G6B5A4R4G4B4A1R5G5B5每个像素占用2个字节(BYTE)R8G8B8每个像素占用3个字节,A8R8G8B8每个像素占用4个字节。



对于一张512*512的纹理的话,R5G6B5格式的文件需要占用512KB的容量,A8R8G8B8格式的文件需要占用1MB的容量;如果是1024*1024的纹理,则各需要2M4M的容量,这对于动辄需要几十、几百张甚至更多纹理的游戏,上G容量的游戏在移动平台上是不容易被接受的(当然,还是有12G的大作的,里面包含了几千张的纹理)

  
聪明的设计师们在想,有没有其他办法,既能表现丰富的色彩和细节,又能是最小失真的情况下,达到更小的纹理容量呢。压缩纹理格式应运而生(当然,并不是在移动平台后才有的产物)




3.常见的压缩纹理格式


基于OpenGLES的压缩纹理有常见的如下几种实现:
1
ETC1Ericssontexture compression)
2
PVRTC(PowerVR texture compression)
3
ATITC(ATI texture compression)
4
S3TC(S3 texture compression)

ETC1:
ETC1
格式是OpenGLES图形标准的一部分,并且被所有的Android设备所支持。
扩展名为:GL_OES_compressed_ETC1_RGB8_texture,不支持透明通道,所以仅能用于不透明纹理。
当加载压缩纹理时,<internalformat>参数支持如下格式:
   GL_ETC1_RGB8_OES(RGB
,每个像素0.5个字节)

PVRTC:
支持的GPUImaginationTechnologiesPowerVRSGX系列。
OpenGLES
的扩展名为:GL_IMG_texture_compression_pvrtc
当加载压缩纹理时,<internalformat>参数支持如下几种格式:
   GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG (RGB
,每个像素0.5个字节)
   GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG (RGB
,每个像素0.25个字节)
   GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG (RGBA
,每个像素0.5个字节)
   GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG(RGBA
,每个像素0.25个字节)

ATITC:
支持的GPUQualcommAdreno系列。
支持的OpenGLES扩展名为:GL_ATI_texture_compression_atitc
当加载压缩纹理时,<internalformat>参数支持如下类型的纹理:
   GL_ATC_RGB_AMD (RGB
,每个像素0.5个字节)
   GL_ATC_RGBA_EXPLICIT_ALPHA_AMD (RGBA
,每个像素1个字节)
   GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD(RGBA
,每个像素1个字节)

S3TC
也被称为DXTC,在PC上广泛被使用,但是在移动设备上还是属于新鲜事物。支持的GPUNVIDIATegra系列。
OpenGLES
扩展名为:
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_s3tc
当加载压缩纹理时,<internalformat>的参数有如下几种格式:
   GL_COMPRESSED_RGB_S3TC_DXT1 (RGB
,每个像素0.5个字节)
   GL_COMPRESSED_RGBA_S3TC_DXT1 (RGBA
,每个像素0.5个字节)
   GL_COMPRESSED_RGBA_S3TC_DXT3 (RGBA
,每个像素1个字节)
   GL_COMPRESSED_RGBA_S3TC_DXT5 (RGBA
,每个像素1个字节)

  
由此可见,Mali系列GPU只支持ETC1格式的压缩纹理,而且该纹理不支持透明通道,有一定局限性。
  
以上压缩纹理格式每个像素大小相对A8R8G8B8格式的比例,最高压缩比是16:1,最低压缩比是4:1,对于减小纹理的数据容量有明显作用,相应在显存带宽上也有明显优势,从而提高游戏的运行效率(此特性没有绝对数值,根据每个游戏的用法和瓶颈点不同而有差别)


4.OpenGL中相关API的使用


1)获得GPU的型号

   glGetString(GL_RENDERER)

2)获得GPU的生产厂商

   glGetString(GL_VENDOR);

3)获取GPU支持哪些压缩纹理

   stringextensions= (const char*)glGetString(GL_EXTENSIONS);

   a.判断是否支持ETC1格式的压缩纹理

   return(extensions.find("GL_OES_compressed_ETC1_RGB8_texture")!=string::npos);

   b.判断是否支持DXT格式的压缩纹理

   return(extensions.find("GL_EXT_texture_compression_dxt1")!=string::npos ||

           extensions.find("GL_EXT_texture_compression_s3tc")!=string::npos);

   c.判断是否支持PVRTC格式的压缩纹理

   return(extensions.find("GL_IMG_texture_compression_pvrtc")!=string::npos);

   d.判断是否支持ATITC格式的压缩纹理

   return(extensions.find("GL_AMD_compressed_ATC_texture")!=string::npos ||

           extensions.find("GL_ATI_texture_compression_atitc")!=string::npos);

4)填充压缩纹理数据

   voidglCompressedTexImage2D (

         GLenumtarget,

         GLintlevel,

        GLenuminternalformat,

         GLsizeiwidth,

        GLsizeiheight,

         GLintborder,

        GLsizeiimageSize,

         constGLvoid * data);

   这里的参数不做详细解释,其中internalformat即是压缩纹理格式的类型。



5.
压缩纹理工具的使用


  
每种压缩纹理以及相应的厂商都提供了压缩纹理的工具,工具都分两个版本:
  a.
可视化转换工具(给美工或小白少量使用)
  b.
命令行转换工具(给程序批量使用)

下面对每个工具的用法进行说明。
1
ImaginationTechnologiesPowerVR
工具下载地址
http://www.imgtec.com/powervr/insider/sdkdownloads/index.asp?installer=Windows%20Installer

可视化转换界面

命令行转换脚本
for%%i in (*.tga) do PVRTexTool.exe -f PVRTC4 -i%%i
(
将本目录下的所有tga文件,转换成"PVRTC4"编码格式的pvr文件,不带mipmap)
详细使用说明:PvrTexTool.exe/?



2QualcommAdreno
工具下载地址
https://developer.qualcomm.com/mobile-development/mobile-technologies/gaming-graphics-optimization-adreno/tools-and-resources

可视化转换界面



命令行转换脚本
for%%i in (*.tga) do QCompressCmd.exe %%i %%i.ktx "ATC RGBAExplicit" yes 
(
将本目录下的所有tga文件,转换成"ATCRGBA Explicit"编码格式的ktx文件,带mipmap)
详细使用说明:QCompressCmd.exe/?


3ARMMali
工具下载地址
http://malideveloper.arm.com/develop-for-mali/mali-gpu-texture-compression-tool/

可视化转换界面



4nVIDIATegra
可以使用DirectXSDK中自带的DirectXTexture Tool进行转换
可视化转换界面

命令行转换脚本
for%%i in (*.tga) do texconv.exe -f DXT5%%i
(
将本目录下的所有tga文件,转换成"DXT5"编码格式的dds文件,不带mipmap)
详细使用说明:TexConv.exe/?


带图pdf传送门:

http://download.csdn.net/detail/huangzeyy/5139941

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值