您的位置:首页 > 其它

使用 ATF SDK压缩纹理

2013-07-12 11:05 567 查看
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的显存似乎是更好的选择,然而为了使用显存你必须使用正确的纹理格式,不同的平台因使用的硬件芯片决定支持哪种压缩的纹理格式,如下表。



[b]为什么用ATF [/b]从上表中你可以看出,如果开发一个多平台游戏,你需要把你的纹理为不同平台压缩成不同的格式。当然有一个方案可以提供所有需要的纹理格式,在运行时可以自动判断当前的平台并上传相应格式的纹理。这很酷吧,如果可以仅仅依赖一个为不同平台进行包装的容器,然后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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: