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

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

1)Imagination Technologies的PowerVR SGX系列

代表型号:PowerVR SGX 535、PowerVR SGX 540、PowerVR SGX 543MP、PowerVR SGX 554MP等
代表作  :Apple iPhone全系、iPad全系,三星I9000、P3100等

2)Qualcomm(高通)的Adreno系列

代表型号:Adreno 200、Adreno 205、Adreno 220、Adreno 320等
代表作  :HTC G10、G14,小米1、2等

3)ARM的Mali系列

代表型号:Mali-400、Mali-T604等
代表作  :三星Galaxy SII、Galaxy SIII、Galaxy Note1、Galaxy Note2(亚版)等

4)nVIDIA(英伟达)的Tegra系列

代表型号:nVIDIA Tegra2、nVIDIA Tegra3等
代表作  :Google Nexus 7,HTC One X等

2. 压缩纹理的必要性
1)首先要说一下图像文件格式和纹理格式的区别。
常用的图像文件格式有BMP,TGA,JPG,GIF,PNG等;
常用的纹理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等。

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

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

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

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

3. 常见的压缩纹理格式
基于OpenGL ES的压缩纹理有常见的如下几种实现:
1)ETC1(Ericsson texture compression)
2)PVRTC (PowerVR texture compression)
3)ATITC (ATI texture compression)
4)S3TC (S3 texture compression)

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

PVRTC:
支持的GPU为Imagination Technologies的PowerVR SGX系列。
OpenGL ES的扩展名为: GL_IMG_texture_compression_pvrtc。
当加载压缩纹理时,<internal format>参数支持如下几种格式:
    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:
支持的GPU为Qualcomm的Adreno系列。
支持的OpenGL ES扩展名为: GL_ATI_texture_compression_atitc。
当加载压缩纹理时,<internal format>参数支持如下类型的纹理:
    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上广泛被使用,但是在移动设备上还是属于新鲜事物。支持的GPU为NVIDIA Tegra系列。
OpenGL ES扩展名为:
GL_EXT_texture_compression_dxt1和GL_EXT_texture_compression_s3tc。
当加载压缩纹理时,<internal format>的参数有如下几种格式:
    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) 填充压缩纹理数据

void glCompressedTexImage2D (

GLenumtarget,

GLintlevel,

GLenuminternalformat,

GLsizeiwidth,

GLsizeiheight,

GLintborder,

GLsizeiimageSize,

const GLvoid * data);

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

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

下面对每个工具的用法进行说明。
1)Imagination Technologies PowerVR
工具下载地址
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 /?

2)Qualcomm Adreno
工具下载地址
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 RGBA Explicit" yes 
(将本目录下的所有tga文件,转换成"ATC RGBA Explicit"编码格式的ktx文件,带mipmap)
详细使用说明:QCompressCmd.exe /?

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

可视化转换界面

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

4)nVIDIA Tegra
可以使用DirectX SDK中自带的DirectX Texture Tool进行转换
可视化转换界面

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

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

各种移动GPU压缩纹理的使用方法相关推荐

  1. 游戏中纹理压缩格式之Texture压缩纹理

    记载目录 1.杂言杂语 2.纹理格式与文件格式的区别 3.常见的纹理格式和应用场合及硬件的特定要求常见的压缩纹理格式硬件需求 4.压缩纹理特殊处理RGBA16 + Dithering 处理ETC1的通 ...

  2. Stage3D的压缩纹理- ATF工具介绍跟下载

    那么这是什么呢? 首先,让我们开始谈论压缩纹理. 在任何技术里GPU编程都是一样的,你有两个选择,你可以选用压缩或没压缩的纹理,那么,有什么区别呢? 当使用未压缩的纹理,将一个png 图形文件上传至G ...

  3. 《多核与GPU编程:工具、方法及实践》----1.3 现代计算机概览

    本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第1章,第1.3节, 作 者 Multicore and GPU Programming: An Integrated ...

  4. ETC1压缩纹理格式详解

    本来以为,ETC1作为Android 设备的OpenGL标准,开源且最常用的的一种压缩纹理格式,总会有人去翻译一下khronos的文档,读一下代码,给大家作个普及的,不料就是搜不到.没办法,尽管英文不 ...

  5. android,ETC1压缩纹理带alpha通道

    天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行指乱其所为,所以动心忍性,曾益其所不能. --<孟子> 1,ETC纹理. opengl2.0的所有android机器支持ET ...

  6. python 图像压缩后前端解压_Python在后台自动解压各种压缩文件的实现方法

    1.需求描述 编写一个 Python 程序,每次下载压缩包形式的文件后,自动将内部文件解压到当前文件夹后将压缩包删除,通过本案例可以学到的知识点: os 模块综合应用 glob 模块综合应用 利用 g ...

  7. linux怎么压缩后保留原文件,Linux 实现压缩保留源文件的方法

    linux下gzip的压缩详解 Linux压缩保留源文件的方法: gzip ?c filename > filename.gz Linux解压缩保留源文件的方法: gunzip ?c filen ...

  8. linux下各种格式的压缩包的压缩、解压方法

    用户经常需要备份计算机系统中的数据,为了节省存储空间,常常将备份文件进行压缩.下面介绍一下备份与压缩的命令,大致总结了linux下各种格式的压缩包的压缩.解压方法.但是部分方法我没有用到,也就不全,希 ...

  9. 《多核与GPU编程:工具、方法及实践》----1.5 并行程序性能的预测与测量

    本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第1章,第1.5节, 作 者 Multicore and GPU Programming: An Integrated ...

最新文章

  1. Apache URL重定向避免网址结尾斜线问题
  2. 《代码大全》阅读笔记02
  3. RocketMQ源码解析:Filtersrv
  4. Nios中PIO的INT
  5. string转short java_[Java基础]之 数据类型转换
  6. YY的GCD(洛谷-P2257)
  7. excel重复上一步快捷键_史上最全的Excel快捷键合集
  8. 桌面虚拟化的架构模块化
  9. python计算2的20次方_Python学习二运算符
  10. VLAN的分类与实验
  11. VMware Perl SDK error “Server Version Unavailable .. line 545”
  12. 随笔--你该如何利用自己的“暗时间”?
  13. 纽约亮马河邮轮 - 从水上欣赏纽约迷人景色
  14. 公众号菜单栏如何添加设置一键导航?
  15. 20 个有用的 Go 语言微服务开发框架吐血总结!!!
  16. sd卡数据损坏怎么回事,sd卡数据损坏怎么恢复
  17. STM32F103RCT6开发板的下载
  18. 怎么把线稿提取出来_ps怎么把彩色图片提取线稿出来,就黑白线稿的那种 要详细!...
  19. 【BZOJ 3687】简单题
  20. html画布画笔粗细,基于javascript html5 canvas实现可调画笔颜色/粗细/橡皮的涂鸦板...

热门文章

  1. python不定参数的函数实现_python传入不定参数是什么
  2. Cmder的安装和设置
  3. _LINUX下的软件包管理 - zjlk
  4. c++接口调用外部类_Java基础:Java语法糖4之内部类
  5. 网页怎么向服务器请求数据,网页怎么向服务器请求数据库
  6. 安卓学习笔记04:安卓平台架构
  7. Java讲课笔记14:final关键字
  8. 【BZOJ3681】Arietta,主席树优化网络流
  9. 【BZOJ3437】小P的牧场,斜率优化DP
  10. 17.立体匹配——匹配问题,好区域匹配 测验,窗口大小的影响,遮蔽(Occlusion),顺序约束_2