使用 ATF SDK压缩纹理

http://www.adobe.com/devnet/flashruntimes/articles/introducing-compressed-textures.html

 

Adobe 去年引入了 stage3d 之后的势头一直在上涨,然而在Adobe Texture Format 和 ATF这块没有给详细的介绍。你可能在stage3d的文档里已经看到它是作为一个压缩的纹理格式。ATF SDK给你提供了一个工具来创建和检查atf格式文件,这篇文章会向你展示atf sdk的大概情况并介绍如果使用它来工作。

 

什么是ATF SDK

首先,你需要对不同格式的纹理和如果使用它们有一定的了解。

当你使用任何技术对GPU进行编程时,你有两种方式可以处理纹理,即压缩的和非压缩的图片。当使用非压缩的纹理图片如PNG时,纹理图片会被上传到GPU里,因为GPU不支持PNG格式,你纹理实际上存储在cpu的内存里。JPEG格式的也是这样。

使用GPU的显存似乎是更好的选择,然而为了使用显存你必须使用正确的纹理格式,不同的平台因使用的硬件芯片决定支持哪种压缩的纹理格式,如下表。

 

为什么用ATF

从上表中你可以看出,如果开发一个多平台游戏,你需要把你的纹理为不同平台压缩成不同的格式。当然有一个方案可以提供所有需要的纹理格式,在运行时可以自动判断当前的平台并上传相应格式的纹理。这很酷吧,如果可以仅仅依赖一个为不同平台进行包装的容器,然后flash player和air可以自动提取需要的格式纹理。这就是ATF可以提供的。

同时ATF提供了如下的好处:

  • 更快的渲染
  • 更低的显存需求(在像IPAD1这样内存非常有限的情况下尤其重要)
  • 更快的纹理上传到显存的速度
  • 使用压缩的纹理时更高的纹理分辨率在使用相同多内存的情况下

 

ATF的结构

你可以认为ATF格式是压缩图像的一个容器,默认的,所有纹理格式(PVRTC, ETC1, DXT1/DXT5)被嵌入到ATF文件里

每一个平台ARI 和FLAYPLAYER自动提取合适的纹理。但在某些情况下你可能只有特定的几个平台。如果目标平台只是ios为什么要把其它格式的纹理加进来呢。为了兼容这种情况,你可以选择性的嵌入到ATF中,它ATF集变得更小。如下图。

注 如果你对ETC1格式熟悉,你可能好奇如果处理透明。FLASH运行时使用双重ETC1通道包括两种纹理,一种为有ALPHA值的通道,一种为其它的颜色。ATF工具可以为你产生两种格式。

DXT1和DXT5的不同处在于对ALPHA的支持,DXT1不支持透明,但DXT5支持,ATF工具可以自动 的检测你图像是否含有透明并选择合适的格式。

当然如果你理存储非压缩的纹理在ATF文件中,你可以如下图存储。

如果你想使用非压缩的纹理,还想使用立体贴图纹理(cube map),自动的mipmap支持甚至纹理流(http://udn.epicgames.com/Three/TextureStreaming.html),这非常有帮助

 

如何使用这个工具

现在你知道了一些有关ATF的知识,下一步可以创建一个ATF文件,ATF SDK包括内部的命令行可以用来创建一个ATF文件,同时也包括ATFVIEWER GUI工具来预览和检查ATF文件。

为了完整的列出SDK的工具和所有命令行的参考,请看ATF 用户指导。

 

png2atf

需要主要知道的工具png2atf。可以从名子中知道它的用处,使用方法如下。

// package leaf.png with all 3 formats (DXT5, PVRTC and ETC1x2)

> png2atf.exe ‐c ‐i leaf.png ‐o leaf.atf

[In 213KB][Out 213KB][Ratio 99.9703%][LZMA:0KB JPEG‐XR:213KB]

 

// package a specific range of mipmaps

> png2atf.exe ‐c ‐n 0,5 ‐i leaf.png ‐o leaf0,5.atf

[In 213KB][Out 213KB][Ratio 99.8825%][LZMA:0KB JPEG‐XR:213KB]

 

//package only DXT format

> png2atf.exe ‐c d ‐i leaf.png ‐o leaf_dxt5.atf

[In 85KB][Out 85KB][Ratio 100.045%][LZMA:0KB JPEG‐XR:85KB]

 

//package only ETC1 format

> png2atf.exe ‐c e ‐i leaf.png ‐o leaf_etc1.atf

[In 85KB][Out 85KB][Ratio 100.045%][LZMA:0KB JPEG‐XR:85KB]

 

//package only PVRTC format

> png2atf.exe ‐c p ‐i leaf.png ‐o leaf_pvrtc.atf

[In 42KB][Out 42KB][Ratio 100.089%][LZMA:0KB JPEG‐XR:42KB]

 

如果想存储非压缩的纹理,去掉-c这个参数

//package as uncompressed (RGBA) format

> png2atf.exe ‐i leaf.png ‐o leaf_uncompressed.atf

[In 341KB][Out 43KB][Ratio 12.8596%][LZMA:0KB JPEG‐XR:43KB]

 

另一个很好的功能是ATF文件可以用于纹理流,产生三个子文件如下

png2atf ‐m ‐n 0,0 ‐c ‐i cubecat0.png ‐o cubecat_c_high.atf

png2atf ‐m ‐n 1,2 ‐c ‐i cubecat0.png ‐o cubecat_c_med.atf

png2atf ‐m ‐n 3,20 ‐c ‐i cubecat0.png ‐o cubecat_c_low.atf

 

Flash Player 11.3 and AIR 3.3.开始支持纹理流,确保在流中可以创建纹理,为streamingLevel指定具体的值当你使用context3d对象的createTexture()方法时。

你可以创造ATF文件包括立体贴图纹理,如下

// to create an ATF for a cube map texture

// prepare a png file for each side of the cube as follows:

// ‐X: cube0.png

// +X: cube1.png

// ‐Y: cube2.png

// +Y: cube3.png

// ‐Z: cube4.png

// +Z: cube5.png

> png2atf.exe ‐c ‐m ‐i cube0.png ‐o cube.atf

 

pvr2atf

如果你已经使用Apple texturetool生成PVR纹理,你可以使用pvr2atf工具转换为ATF文件,用法和png2atf基本一样。

> pvr2atf -r test.pvr -o test.atf

[In 4096KB][Out 410 KB][Ratio 10.0241%][LZMA:0KB JPEG-XR:410KB]

 

ATFVIEWER

ATFVIEWER是一个图形工具,可以预览和检查ATF文件,它基本的目的是播放audit DXT1, ETC1, and PVRTC压缩文件

当导入的atf文件只包括一种格式时 另两种格式的可选项是不可选的

注 上图中在集成代码片断时有小的错误,下一版会修正。要看正确的代码请看下一个section Using compressed textures in ActionScript.

 

 

其它的工具

作为基本工具的附加,ATF SDK包括了其它的命令行,如从其它格式文件成功ATF文件,检查PNG文件,得到ATF文件信息,详情请看用户指导。

 

在ACTIONSCRIPT中使用压缩的纹理

是否使用STAGE3D 或STARLING决定了在actionscript中使用压缩纹理的方式。为了让ATF纹理包括全部的功能,你需要满足以下要求:

  • Starling 1.2及以上
  • 直接使用stage3d需要使用最新的 AGALMiniAssembler.
  • 需要AIR SDK3.4及以上(FLASH BUILDER4.7包括)
  • Flash Player 11.4 or AIR 3.4及以上
  • 加这个编译参数" -swf-version=17"

 

 

在stage3d中使用压缩纹理

为了在stage3d中使用压缩纹理,你需要使用Context3D.createTexture()创造一个texture 对象,它的参数得是Context3DTextureFormat.COMPRESSED_ALPHA or Context3DTextureFormat.COMPRESSED.,最后调用texture对象的uploadCompressedTextureFromByteArray(),把atf文件的字节码作为它的参数如下。

 

[Embed(source="mytexture.atf", mimeType="application/octet‐stream")] public static const TextureAsset:Class;

public var context3D:Context3D;

public function init():void{

var texture:Texture = context3D.createTexture(256, 256, Context3DTextureFormat.COMPRESSED_ALPHA, false);

var textureAsset:ByteArray = new TextureAsset() as ByteArray; texture.uploadCompressedTextureFromByteArray(textureAsset, 0);

}

 

如果使用的是立体贴图纹理,使用Context3D.createCubeTexture() 如下

var texCubemap:CubeTexture = context3D.createCubeTexture(256, Context3DTextureFormat.COMPRESSED_ALPHA, false); var textureAsset:ByteArray = new TextureAsset() as ByteArray; texCubemap.uploadCompressedTextureFromByteArray(textureAsset, 0);

 

另外,依赖纹理的格式,你需要指定dxt1 或 dxt5,作为fragment shader:的纹理采样器。

  • 使用dxt1,如果纹理格式指定是Context3DTextureFormat.COMPRESSED(无论纹理的具体格式是DXT PVRTC ETC1)
  • 使用dxt5如果纹理格式指定是Context3DTextureFormat.COMPRESSED_ALPHA(无论纹理的具体格式是DXT PVRTC ETC1)
  • 什么都不指定如果格式是Context3DTextureFormat.BGRA

要看starling 加载ATF文件的例子,check out Starling commit for ATF support on GitHub,

 

在starling中使用压缩的纹理

对starling用户的有利消息:starling已经内置了对ATF纹理的支持,通过starling 的Texture.fromAtfData(),如下代码。

[Embed(source="starling.atf", mimeType="application/octet-stream")] public static const CompressedData:Class;

var data:ByteArray = new CompressedData();

var texture:Texture = Texture.fromAtfData(data);

var image:Image = new Image(texture);

addChild(image);

 

更详细的请看Starling Wiki page on using ATF textures.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值