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

介绍了各种移动设备所使用的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/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/p/3561099.html

时间: 2024-09-13 18:46:06

[转]各种移动GPU压缩纹理的使用方法的相关文章

ETC1压缩纹理格式详解

本来以为,ETC1作为Android 设备的OpenGL标准,开源且最常用的的一种压缩纹理格式,总会有人去翻译一下khronos的文档,读一下代码,给大家作个普及的,不料就是搜不到.没办法,尽管英文不好,还是硬啃了下文档,把 ETC1压缩纹理的实现原理弄清楚了. https://www.khronos.org/registry/gles/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt 至于什么是压缩纹理,如何使用,可以参考: http://

php打包压缩文件之ZipArchive方法用法分析_php技巧

本文实例讲述了php打包压缩文件之ZipArchive方法用法.分享给大家供大家参考,具体如下: 前面说到了php打包压缩文件之PclZip方法,今天来说下另一种更为简单的方法,使用ZipArchive来压缩文件.这个是php的扩展类,自php5.2版本以后就已经支持这个扩展,如果你在使用的时候出现错误,查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库. 使用ZipArchive压缩文件是非常简单的,php官网已

Android实现zip文件压缩及解压缩的方法_Android

本文实例讲述了Android实现zip文件压缩及解压缩的方法.分享给大家供大家参考.具体如下: DirTraversal.java如下: package com.once; import java.io.File; import java.util.ArrayList; import java.util.LinkedList; /** * 文件夹遍历 * @author once * */ public class DirTraversal { //no recursion public sta

OpenGL ES 纹理参数设置方法 glTexParameter

OpenGL ES 纹理参数设置方法 glTexParameter 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 以下译自官网. 最近几天,会针对该方法的每个参数,做相应的翻译.分析理解和测试

WinXP系统安装direct9.0时提示不能信任一个安装所需的压缩文件的解决方法

随着科技的发展,系统的升级越来越快,可是人们刚开始使用的xp系统已经习惯,升级的系统并不习惯,所以一些用户还是在使用着xp系统.最近,用户在安装direct9.0时,提示不能信任一个安装所需的压缩文件,应该如何解决呢?那现在就跟小编一起去看看WinXP系统安装direct9.0时提示不能信任一个安装所需的压缩文件的解决方法! 解决办法: 一. 首先大家先解压下载下来的软件压缩包,进行解压完之后,找到解压出来的软件,鼠标右键"以管理员方式"安装这个软件. 二. 假如大家是在安装游戏过程中

《多核与GPU编程:工具、方法及实践》----2.3 分解模式

2.3 分解模式 设计过程最困难同时也最关键的部分无疑是分解过程,即确定可以并发执行的计算.虽然任务图法是最常用的,但开发者无法从中获取以往的经验,这时就需要模式.Mattson等人[33]列出了若干分解模式(在他们的书中表示为"algorithm structure design space patterns"), 该参考文献包含了工作负载被分解并最终分配到并行或多核平台各个节点上的基本方法.图2-4显示了能得到6个模式之一的决策树. 上一节提到了两类分解,即功能分解和域分解,现在又

Mysql备份压缩及恢复数据库方法总结

  一般情况我们通过mysqldump来备份MySQL数据库,并上传至其它备份机器.如果数据库比较大,在备份传输的时候可能会慢,所以我们尽量让备份的文件小一些. 在写自动备份脚本时,最好把备份结果直接压缩,恢复时也可以直接由压缩备份恢复.下面介绍如何使用bzip2和gzip进行压缩mysql备份文件. 备份并用bzip压缩: 代码如下   mysqldump | bzip2 > outputfile.sql.bz2 从bzip2备份恢复: 代码如下   bunzip2 < outputfile

Linux压缩打包命令使用方法

  参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里面的文件! 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在! 因为不可能同时压缩与解压缩. -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩? -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩? -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程! -f :使用档名,请留意

Linux系统下在命令行中压缩JPEG图像的方法

  如今拍照设备(如智能手机.数码相机)拍出来的图片分辨率越来越大.甚至3630万像素的Nikon D800已经冲入市场,并且这个趋势根本停不下来.如今的拍照设备不断地提高着照片分辨率,使得我们不得不压缩后,再上传到有储存限制.带宽限制的云. 事实上,这里有一个非常简单的方法压缩JPEG图像.一个叫"jpegoptim"命令行工具可以帮助你"无损"美化JPEG图像,让你可以压缩JPEG图片而不至于牺牲他们的质量.万一你的存储空间和带宽预算真的很少,jpegoptim