Basis压缩纹理制作与利用
Basis Universal 是一种新的图像格式,旨在生成非常小的文件大小,在显卡而不是 CPU 上解码,使其解码速度非常快,非常适合 WebGL 场景。 你可以使用Basis纹理在线查看工具检查你的Basis压缩纹理。
为了演示 Basis 的效率,我购买了一张 8000×4000px1 图像作为我的天空盒。 通常这会花费很长时间下载并占用大量纹理空间。 Basis 的下载量更小,游戏运行时占用的内存空间也更少,从而使游戏的纹理数量增加 6-8 倍!
对于下面的示例,图像从 PNG 形式的 15MB 缩小到基础文件形式的 0.6MB。 让我拥有这个巨大而美丽的天空盒,只需一个非常快速的小文件下载,并且不会牺牲我所有宝贵的纹理空间,为其他游戏纹理留下大量空间。
设置 Basis 只花了几分钟,但确实值得。
1、制作basis纹理
我们使用 Basis Universal 项目中的 basicu 程序对基础文件进行编码。 不幸的是,没有预编译的二进制文件可供我们使用,因此我们需要编译自己的二进制文件。
我测试了在 Linux 64 位上构建图像编码器的说明,我个人使用的是 Chrome 操作系统中内置的 Linux VM。
第一步是安装用于编译 basicu 二进制文件的 Linux 依赖项。
sudo apt-get install git build-essential cmake make
然后我们从Github下载Basis的源代码:
git clone https://github.com/BinomialLLC/basis_universal.git
cd basis_universal
按照构建说明进行操作:
cmake CMakeLists.txt
make
现在二进制文件已构建完毕,应该能够使用新编译的二进制文件将 sRGB PNG 编码为基础文件。
./bin/basisu ~/Downloads/ada.png
这可能需要几秒钟,但一旦完成,它应该会在当前目录中创建一个具有相同名称但扩展名为 .basis 的文件。 我们可以将此 .basis 文件加载到 THREE.js 中
我原来的ada.png是1.8MB,超级压缩的基础文件只有0.145MB,比同等的JPEG还要小!
你可以探索一些选项来调整图像的编码方式。
2、使用basis纹理
此代码主要取自 THREE.js 基础加载器示例。 该演示是使用 THREE.js 版本 106 构建的。
导入基础纹理加载器使用 ES 模块语法来加载模块。 我已将“node_modules”目录公开为静态文件夹。 因此,请确保你的 <script>
标签声明为 type=module
。或者使用你喜欢的打包器(例如 webpack 或 rollup)预编译它。
import { BasisTextureLoader } from "/node_modules/three/examples/jsm/loaders/BasisTextureLoader.js";
创建一个对象并为其分配纹理,稍后我们将更新该纹理上的贴图:
const geometry = new THREE.SphereBufferGeometry( 1, 50, 50 );
const material = new THREE.MeshBasicMaterial();
const sphere = new THREE.Mesh( geometry, material );
scene.add( sphere );
我们现在可以加载纹理:
// Make a new instance of the loader
const basisLoader = new BasisTextureLoader();
// Set the location of the Web Worker Script from THREE.js
basisLoader.setTranscoderPath(
'/node_modules/three/examples/js/libs/basis/'
);
basisLoader.detectSupport( renderer );
// Load your Basis Image
basisLoader.load( '/ada.basis',
function (texture) {
// Once the texture has loaded, update the .map of the material
texture.encoding = THREE.sRGBEncoding;
material.map = texture;
material.needsUpdate = true;
}, undefined, function ( error ) {
console.error( error );
}
);
我希望这可以帮助你利用basis纹理的强大功能。 :)
原文链接:Using Basis Textures in Three.js
BimAnt翻译整理,转载请标明出处