纹理优化三-KTX纹理压缩

KTX简介:

在这里插入图片描述
KTX (Khronos Texture) 是一种通用的文件格式,用于存储和分发压缩或未压缩的纹理数据。KTX它是由Khronos Group开发,支持OpenGL、OpenGL ES和WebGL等API。简单来说KTX不是一种压缩算法,而是一种容器格式,它可以包含使用各种压缩技术(如ASTC、ETC、DXT/S3TC等)压缩的纹理数据!KTX可用于存储利用ASTC、BCn、ETC等不同压缩技术压缩后的纹理。这些压缩技术(ASTC、BCn、ETC)则是实现具体压缩算法的方式,每种算法都有其独特的特征和适用场景。
在这里插入图片描述

如果网络流式传输完全不需要这些gpu用的压缩啊(只需要体积减少)有压缩比更高还无损的比如zip(纹理压缩体积会变大,这个是给你GPU读取更快的算法) 这个是给你GPU读取更快的算法。就跟我之前的文章说过纹理压缩与图片压缩的区别。

压缩算法的区别:

ASTC (Adaptive Scalable Texture Compression)

  • ASTC是一种纹理压缩格式,由ARM公司提出并得到Khronos Group的支持。它被用于OpenGL、OpenGL
    ES和Vulkan等API。

  • ASTC的主要优势是其高度可配置的块大小(4x4至12x12像素),压缩都是块压缩比如最小的2*2,它允许开发者根据需要在图像质量和压缩比率之间进行权衡。

  • ASTC支持更高级的颜色压缩和alpha通道压缩,并且适用HDR内容。

BCN (Block Compression, previously known as DXTn or S3TC)

  • BCN(DXT1、DXT3、DXT5等)是一系列硬件友好的纹理压缩格式,由S3
    Graphics开发,并成为DirectX的一部分,也被OpenGL广泛支持。
    我之前的dds文章之前有介绍

ETC (Ericsson Texture Compression)

  • ETC是由Ericsson公司开发的一种压缩格式,用于OpenGL ES和WebGL,主要用于安卓等移动端,ETC1仅支持RGB格式的压缩,没有alpha通道。后来推出的ETC2提供了完整的RGB和RGBA支持,成为了OpenGL ES 3.0标准的一部分。

纹理压缩与图像压缩的内存对比

纹理压缩为什么存储体积变大,在显存占的显存是否变大: 只是传输体积会变大(网络传输或者磁盘体积变大),但是特别注意在GPU的内存会变小, 传输体积变大是因为JPG和PNG这种本来就设计有压缩, 传统图像只是因为编码减少了传输体积,还是要decode的!压缩纹理也可以GZIP但效果没那么好所以通常纹理压缩了的不再进行像JPG/png压缩,然而JPG/PNG decode后仍然是RGBA8/RGBA4/RGB24的,所以最终实际占据的内存和显存更多,decode也需要时间, 压缩纹理不需要再CPU做decode, 所以你文件体积多大在显存里就是多大 。容易混淆了两个"内存"(总结一下就是jpg\png那种是解压后在GPU采样得到的比纹理压缩的体积相对大) ;压缩纹理最大的问题就是有损,在UI这种情况可能不太适用。

Basis Universal 超压缩的支持,以实现可靠,无处不在的GPU纹理分布。 Basis Universal是Binomia l开发的一种压缩技术,可产生紧凑的纹理,这些纹理可以在运行时有效地转码为各种GPU压缩纹理格式。除此之外,Khronos发布了KHR_texture_basisu 扩展,使glTF可以包含KTX 2.0纹理,从而产生了可普遍发布的glTF资产,这些资产减小了下载尺寸,并使用了本地支持的纹理格式来减小GPU内存大小并提高了在各种设备和平台上的渲染速度。最后,Khronos发布了开源工具和代码转换器,以及开发人员和艺术家指南,以支持并鼓励在glTF生态系统中广泛使用KTX 2.0纹理,包括已经集成了支持功能的three.js,Babylon.js和Gestaltor查看器。
纹理贴图通常使用JPG或PNG压缩图像来传输具有减小的文件大小的纹理。 但是,这些格式不能直接由GPU处理,必须在GPU内存中解压缩为完整大小的图像,从而消耗宝贵的内存空间和带宽,并导致较差的渲染性能和高功耗,这在移动设备上尤其成问题。 GPU压缩的纹理格式可实现紧凑的内存纹理,并具有优化的内存访问,可实现更快,更高效的渲染。 但是,在分布广泛的glTF资产中使用GPU纹理格式是不切实际的,因为高度分散的GPU纹理格式格式(与硬件有关所以定义一种中间的格式),会使它们无法在许多目标设备上使用
Binomial的Basis Universal压缩技术通过定义一种“通用”压缩纹理格式来解决此问题,该格式可以在运行时有效地转码为目标设备上本机支持的GPU格式。 Basis Universal 目前包含两种可以快速转码为任何 GPU 支持的格式的格式:LZ/ETC1S(结合了块压缩和超级压缩)和 UASTC(一种块压缩格式)。 LZ/ETC1S 以外的格式可以使用 Zstd 和 ZLIB 进行超级压缩。 Basis Universal为开发人员提供了两种压缩选项,这些选项将Khronos定义的ETC1和ASTC GPU纹理格式的选定模式与RDO编码和基于LZ的超压缩相结合,以实现紧凑的纹理文件尺寸。 与JPEG和PNG纹理相比,ETC1S模式可以实现更小的传输和内存大小。 与ETC1S相比,UASTC模式可提供更高质量的纹理,特别适用于法线贴图,同时仍可实现较小的文件大小和显着的内存节省。

ktx 有很多种格式,如 astc, dxt, pvrtc, etc1,etc2
在这里插入图片描述

纹理优化:

纹理优化一、纹理压缩
纹理优化二-模型贴图优化

更关键的: Khronos 还发布了 KHR_texture_basisu 扩展,使 glTF 能够包含 KTX 2.0 纹理,从而产生可普遍分发的 glTF 资源,从而减少下载大小并使用本机支持的纹理格式来减少 GPU 内存大小并提高不同设备和平台上的渲染速度。
KHR_texture_basisu
在这里插入图片描述

Basis Universal 提供两种压缩选项。 ETC1S 模式可实现比 JPEG 和 PNG 纹理显着更小的传输和 GPU 内存大小。 UASTC 模式可提供比 ETC1S 更高质量的纹理,同时仍可显着节省内存。单击下图进行更高分辨率的比较。
在这里插入图片描述
添库与开发工具

参考资料:

各种移动GPU压缩纹理的使用方法
纹理压缩简介
gltf中的ktx2.0 texture
ktx官网

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PixiJS 6 可以通过使用 `pixi-compressed-textures` 插件来支持 KTX 压缩纹理格式。 首先,你需要安装 `pixi-compressed-textures` 插件。可以通过 npm 命令来安装: ``` npm install pixi-compressed-textures ``` 然后,你需要在项目中引入 `pixi-compressed-textures` 插件: ```js import { CompressedTextureLoader } from 'pixi-compressed-textures'; ``` 接下来,你可以使用 `CompressedTextureLoader` 来加载 KTX 压缩纹理: ```js const loader = new PIXI.Loader(); const compressedTextureLoader = new CompressedTextureLoader(); loader.add('compressedTexture', 'path/to/compressedTexture.ktx', { loadType: PIXI.LoaderResource.LOAD_TYPE.XHR, xhrType: PIXI.LoaderResource.XHR_RESPONSE_TYPE.BUFFER, metadata: { // 设置使用 pixi-compressed-textures 插件来加载 KTX 压缩纹理 compressedTexture: true } }); loader.use(compressedTextureLoader.middleware()); loader.load((loader, resources) => { const texture = resources.compressedTexture.texture; // 将压缩纹理应用到 Sprite const sprite = new PIXI.Sprite(texture); // ... }); ``` 在上面的代码中,我们首先创建了一个 `PIXI.Loader` 实例,并且通过 `CompressedTextureLoader` 创建了一个 `compressedTextureLoader` 实例。然后,我们使用 `loader.add` 方法来添加需要加载的 KTX 压缩纹理,并且设置 `metadata` 属性,告诉加载器使用 `pixi-compressed-textures` 插件来加载该资源。接下来,我们使用 `loader.use` 方法来注册 `compressedTextureLoader` 实例的中间件,以便在加载 KTX 压缩纹理时能够正确地解码。 最后,在加载完成后,我们可以通过 `resources.compressedTexture.texture` 获取到加载的压缩纹理,并且将其应用到 `PIXI.Sprite` 实例中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值