本文系原创整理,欢迎转载,请标明链接 http://www.cnblogs.com/luming1979

有问题欢迎加qq群讨论:366239605

介绍了各种移动设备所使用的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支持哪些压缩纹理

string extensions = (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 (

GLenum target,

GLint level,

GLenum internalformat,

GLsizei width,

GLsizei height,

GLint border,

GLsizei imageSize,

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 /?

有问题欢迎加qq群讨论:366239605

各种移动GPU压缩纹理的使用方法的更多相关文章

  1. [转]各种移动GPU压缩纹理的使用方法

    介绍了各种移动设备所使用的GPU,以及各个GPU所支持的压缩纹理的格式和使用方法.1. 移动GPU大全 目前移动市场的GPU主要有四大厂商系列:1)Imagination Technologies的P ...

  2. Android 使用压缩纹理

    本文介绍了什么是压缩纹理,以及加载压缩纹理的核心步骤.并在 Android OpenGLES 平台上实现了压缩纹理的显示. 一.压缩纹理概念 传统的图片文件格式有 PNG . JPEG 等,这种类型的 ...

  3. OpenGL ES 压缩纹理

    什么是压缩纹理 在实际应用特别是游戏中纹理占用了相当大的包体积,而且GPU无法直接解码目前流行的图片格式,图片必须转换为RGB等类型的格式才能上传到GPU内存,这显然增加了GPU内存的占用.为了处理这 ...

  4. C#执行zip文件压缩的几种方法及我遇到的坑总结

    工作项目中需要用到zip压缩解压缩文件,一开始看上了Ionic.Zip.dll这个类库,操作方便,写法简单 对应有个ziphelper类 using Ionic.Zip; public static ...

  5. SQL Server 2008删除或压缩数据库日志的方法

    SQL Server 2008删除或压缩数据库日志的方法 2010-09-20 20:15 由 于数据库日志增长被设置为“无限制”,所以时间一长日志文件必然会很大,一个400G的数据库居然有600G的 ...

  6. OpenGL 加载DDS文件(压缩纹理)

    想必很多人都见过DDS这种文件,它是一个“图片文件”,如果你安装了某些看图软件,你可以直接双击打开它来进行预览. 那么,这种DDS文件和我们常见的TGA/PNG之类的文件有何不同呢? DDS和TGA/ ...

  7. Win10提示“您未连接到nvidia gpu的显示器”的解决方法

    显卡有Nvidia 和 ATI两个芯片,我们经常称他们为N卡和A卡,N卡更加注重于性能,而A卡则为颜色艳丽,画面更好.不过,最近一些windows10系统用户在使用N卡过程中,遇到了提示“您当前未使用 ...

  8. gzip gunzip压缩保留源文件的方法:

    Linux压缩保留源文件的方法: gzip –c filename > filename.gz Linux解压缩保留源文件的方法: gunzip –c filename.gz > file ...

  9. PHP压缩文件夹的方法

    PHP压缩文件夹的方法<pre> public function addFileToZip($path, $zip) { $handler = opendir($path); //打开当前 ...

随机推荐

  1. storm是怎样保证at least once语义的

    背景 本篇看看storm是通过什么机制来保证消息至少处理一次的语义的. storm中的一些原语 要说明上面的问题,得先了解storm中的一些原语,比方: tuple和message 在storm中,消 ...

  2. js中变量的声明

    大家都知道js中变量的声明是要提前的,下面有4个样例: 1.if(!"t" in window){  var t = 1; }       alert(t);答案是undefine ...

  3. EasyDarwin开源流媒体音视频云平台遇到的奇葩问题:内网运行正常,公网流媒体不通

    最近在帮助EasyDarwin的用户部署EasyNVR+EasyDarwin云平台+EasyClient方案的过程中,遇到一个问题,EasyNVR分布在用户各地区现场的内网中,EasyDarwin云平 ...

  4. ftp上传文件不能上传到指定的文件夹

    首先是,使用ftp创建连接,这一点没有错误,但是在切换目录创建文件夹的时候出现了问题. 指定创建的文件夹,总是创建失败,切换目录同样失败.最后查看文件夹的权限才知道,没有权限的问题: 然后给img文件 ...

  5. Java 获取当前日期和时间

    原文地址:http://www.blogjava.net/parable-myth/archive/2013/01/17/394364.html 有三种方法: 方法一:用java.util.Date类 ...

  6. JBPM工作流简单步骤

    启动流程: 获取最新的流程定义: JbpmContext.getCurrentJbpmContext().getGraphSession().findLatestProcessDefinitions( ...

  7. React + fetch API + 百度地图api + 跨域 填坑

    做项目遇到一个百度地图api 的跨域问题.由于使用fetch ,在调用类似 http://api.map.baidu.com/geocoder/v2/callback=renderReverse&am ...

  8. Windows程序设计(1)——Win32运行原理(三)

    进程控制 1 获得系统进程 2 终止当前进程 3 终止其他进程 4 进程控制 4.1 获得系统进程 使用toolhelp模块可以实现获取系统中当前运行当中的进程列表. 思路如下,使用CreateToo ...

  9. 【USACO OPEN 10】hop

    奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3 <=N <= 250,000),编号为1..N. 就像任何一个好游戏一样,这样的跳格子游戏也 ...

  10. hihocoder #1122 二分图二•二分图最大匹配之匈牙利算法(*【模板】应用 )

    梳理整个算法: 1. 依次枚举每一个点i: 2. 若点i尚未匹配,则以此点为起点查询一次交错路径. 最后即可得到最大匹配数. 在这个基础上仍然有两个可以优化的地方: 1.对于点的枚举:当我们枚举了所有 ...