主流GPU纹理格式

本文主要介绍主流移动设备GPU,以及所支持的压缩格式

1.GPU分类

1.1 Imagination Technologies的PowerVR SGX系列

代表型号:PowerVR SGX 535、PowerVR SGX 540、PowerVR
SGX 543MP、PowerVR SGX 554MP等

代表产品  :Apple iPhone全系、iPad全系,三星I9000、P3100等

1.2 Qualcomm(高通)的Adreno系列

代表型号:Adreno 200、Adreno 205、Adreno 220、Adreno
320等

代表产品  :HTC G10、G14,SamSung Glaxg S4,SE xperia、WP8、小米1、2等

1.3 ARM的Mali系列

代表型号:Mali-400、Mali-T604等

代表产品  :三星Galaxy SII、Galaxy SIII、Galaxy Note1、Galaxy Note2(亚版)等

1.4 nVIDIA(英伟达)的Tegra/GeForce系列

代表型号:nVIDIA Tegra2、nVIDIA Tegra3等

代表产品  :moto、Google Nexus 7,HTC One X、xiaomi3 、Tagra4等

2. 压缩纹理格式

常用的图像文件格式有:BMP、JPG、PNG、TGA等

常用的纹理格式有:RGB-565、  RGBA-4444、RGBA-5551、RGB-888、RGBA-8888等

文件格式是图像为了存储而使用的编码格式,这些存储格式都是在硬盘保存的特殊编码格式,需要CPU读入,通过特定解码格式获得数据,然后传给GPU使用。

纹理格式是能够被GPU识别的像素格式,能够被快速寻址采样。

2.1 OpenES支持的纹理格式

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的大作的,里面包含了几千张的纹理)。

2.2 常用的压缩纹理格式

基于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个字节)

可以自行扩展为半透方式:

详细内容可以参考这里 。

有两种方案可以选择,一种是通过Mali工具生成pkm文件时选择Create atlas,这样就生成了一张拼接在一起的纹理。这张纹理上半部分是原始图片(无alpha信息),下半部分是alpha信息图片。在渲染的时候使用特殊的shader进行渲染。这个改动是比较小的。

另一种方案是创建两张分离的图片,分别是原始图片和alpha图片。渲染时加载这两张纹理,然后alpha图片当做参数传递给原始图片的shader。

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,对于减小纹理的数据容量有明显作用,相应在显存带宽上也有明显优势,从而提高游戏的运行效率(此特性没有绝对数值,根据每个游戏的用法和瓶颈点不同而有差别)。

2.3  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即是压缩纹理格式的类型。

3.压缩纹理工具的使用

每种压缩纹理以及相应的厂商都提供了压缩纹理的工具,工具都分两个版本:

a. 可视化转换工具

b. 命令行转换工具

下面对每个工具的用法进行说明。

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

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

3.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

时间: 2024-10-30 13:33:11

主流GPU纹理格式的相关文章

手机游戏开发中如何选择适合的纹理格式

为毛要写这个 本来觉得像这样的问题,是无法归类的,因为不同的项目有不同的需求,但今天因为quick论坛中的一个技术疑问贴,钩起了我整理这篇文章的兴趣 http://www.cocoachina.com/bbs/read.php?tid=214811 于是,我决定尽力描述一下纹理格式选择方面的问题,一是起到一个科普的作用,因为目前没有发现十分完整的讲这方面的文章.二是整理一下自己的思路. 当然,这些东西肯定不是我自己凭空YY出来的,我也是参考了不少文章,也从项目中总结了一些问题.在此先列出一些链接

游戏内图片-文件格式与纹理格式

有一篇好文章,链接门:Unity3D手游开发实践<腾讯桌球>客户端开发经验总结 文章里提到了游戏内图片-文件格式与纹理格式 我才第一次恍然知道了,文件格式和纹理格式原来是酱紫的关系.以前我是有多神经大条,处理了那么多图片竟然没有懂细想它们的关系…… 常用的图像文件格式有BMP,TGA,JPG,GIF,PNG等: 常用的纹理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等. 文件格式是图像为了存储信息而使用的对信息的特殊编码方式,它存储在磁盘中,或者内存

【好记性不如烂笔头】常用的图片 文件格式 和 纹理格式

[好记性不如烂笔头]常用的图片 文件格式 和 纹理格式 1,常用的图片文件格式: bmp ( window 下通用格式 Bitmap 除了深度可选,不采用任何压缩) gif (一种基于LZW算法的连续色调的无损压缩格式 压缩率在50%) jpeg(非常流行的图像格式,有损压缩 ,不支持透明像素 ,压缩比较大 ) png(和jpg类似,压缩比高于gif ,支持透明度,无损压缩 ) 2,常用的纹理格式: R5G6B5, A4R4G4B4, A1R5G5B5, R8G8B8, A8R8G8B8 pvr

【原创】Linux环境下的图形系统和AMD R600显卡编程(6)——AMD显卡GPU命令格式

前面一篇blog里面描述了命令环缓冲区机制,在命令环机制下,驱动写入PM4(不知道为何会取这样一个名字)包格式的命令对显卡进行配置.这一篇blog将详细介绍命令包的格式. 当前定义了4中命令包,分别是0型/1型/2型和3型命令包,命令包由两部分组成,第一部分是命令包头,第二部分是命令包主体,命令包头为请求GPU执行的具体操作,命令主体为执行该操作需要的数据. 0型命令包 0型命令包用于写连续N个寄存器.包主体部分是依次往这些寄存器写的值.包头各个部分的意义为: 位 域名称 描述 12:0 BAS

为啥我们的项目中从来不使用ETC1纹理格式

我们通过不同格式的效果来比较下就明白了 无压缩RGBA32格式的效果(所有GPU支持) 请无视接缝问题,那个是美术的UV给展错了... ATC压缩格式(Adreno系列GPU支持的格式) 肉眼几乎干不出差别,饱和度有稍许下降 PS:DXT.PVR的效果也差不多是这样,这里就不贴了,有兴趣的人自己可以试验下 最后是万恶的ETC1(所有GPU支持) 注意下图的红色箭头所指的线,这个仅出现在ETC1格式上,怀疑是它的压缩算法有缺陷,但具体原因并未做过调查 结论 这东西根本不能用啊,特别是对比度比较大的

常用纹理和纹理压缩格式

转载至: http://blog.csdn.net/ynnmnm/article/details/44983545 by 夜风 简单纹理格式 RGBA8888 每个像素4字节,RGBA通道各占用8位 RGBA4444 每个像素2字节,RGBA通道各占用4位 RGB888 每个像素3字节,RGB通道各占用8位,无透明通道 RGB565 每个像素2字节,RGB通道各占用5/6/5位,无透明通道 RGBA5551 每个像素2字节,RGB通道各占用5位,透明通道1位,所以要么完全透明要么不透明 DXT纹

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

http://imgtec.eetrend.com/blog/2213 http://news.mydrivers.com/1/266/266555_all.htm#3 介绍了各种移动设备所使用的GPU,以及各个GPU所支持的压缩纹理的格式和使用方法. 1. 移动GPU大全 目前移动市场的GPU主要有四大厂商系列: 1)Imagination Technologies的PowerVR SGX系列 代表型号:PowerVR SGX 535.PowerVR SGX 540.PowerVR SGX 5

Unity3d纹理压缩格式表

将Texure Type设置为Advanced时纹理的格式列表 格式 详解 Automatic Compressed 压缩RGB纹理,默认选项,常用的漫反射纹理格式.4位/像素(32KB, 256x256) RGB Compressed DXT1 压缩的RGB纹理.常用的漫反射纹理格式.4位/像素(32KB, 256x256) RGBA Compressed DXT5 压缩的RGBA纹理.是漫反射和高光控制纹理的主要格式.1字节/像素(64KB, 256x256) RGB Compressed

还原堆栈信息,分析地形系统使用ASTC格式的纹理导致Crash的问题

0x00 前言 在这篇文章中,我们选择了过去一周Unity官方社区交流群中比较有代表性的几个问题,总结在这里和大家进行分享.主要涵盖了IL2CPP.Scripting.Virtual Reality.Graphics.Editor.Terrain.Plugins .Education等领域,其中会着重介绍一下在原生的地形系统中使用ASTC格式纹理导致Crash的问题. 在文章结尾处我们还总结了社区小伙伴们过去一周在群里分享的一些干货连接. 同时,也欢迎大家加入我们这个讨论干货的官方技术群,交流看