天天看点

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

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

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

1)imagination technologies的powervr sgx系列

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

代表型号:powervr sgx 535、powervr sgx 540、powervr sgx 543mp、powervr sgx 554mp等 代表作  :apple iphone全系、ipad全系,三星i9000、p3100等

2)qualcomm(高通)的adreno系列

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

代表型号:adreno 200、adreno 205、adreno 220、adreno 320等 代表作  :htc g10、g14,小米1、2等

3)arm的mali系列

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

代表型号:mali-400、mali-t604等 代表作  :三星galaxy sii、galaxy siii、galaxy note1、galaxy note2(亚版)等

4)nvidia(英伟达)的tegra系列

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

代表型号: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个字节。

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

    对于一张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. 命令行转换工具 (给程序批量使用)

可视化转换界面

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

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

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

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

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

命令行转换脚本 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进行转换 可视化转换界面

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

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

简介:09年入行,喜欢游戏和编程,对3d游戏和引擎尤其感兴趣。 

版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

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

继续阅读