#glsl-shader #gamedev #graphics #tool

bin+lib shader-crusher

用于优化 glsl 着色器大小的辅助工具

10 个不稳定版本 (3 个重大更改)

0.4.1-alpha2022年8月27日
0.4.0-alpha2022年8月26日
0.3.12-alpha2022年8月26日
0.3.11-alpha 2022年7月22日
0.1.3 2021年4月7日

#277 in 压缩


用于 omt

MIT 许可证

27KB
620

危险 - 状态

对我有效,但可能会擦除你的硬盘。

Windows Status MacOS Status Linux Status

什么?

接受 glsl 着色器,删除空白、注释等,并用更短的符号/标识符/类型名称替换,以实现更好的压缩。

为什么?

我厌倦了安装 mono 以使 shader-minifier 工作,并且需要可以嵌入到我的工具中的东西。

为什么 Rust?

因为。并且我想学习 Rust。

而且它是可移植的,快速的,并且面向未来。

使用方法

命令行

cargo run --help

cargo run -- --input shader.glsl --output shader_crushed.glsl

使用 --blacklist "不要,crush,这些"


// code

#pragma SHADER_CRUSHER_OFF

// code

#pragma SHADER_CRUSHER_ON

// code

以保留某些标识符不变,例如需要在外部解析的 uniform。关键字、内置函数和 'main' 将自动列入黑名单。

嵌入/链接

从 C/C++

shader_crusher::ShaderCrusher* pShaderCrusher = shader_crusher::shadercrusher_new();
shader_crusher::shadercrusher_set_input( pShaderCrusher, fragmentString.c_str() );
shader_crusher::shadercrusher_crush( pShaderCrusher );
char* pOutput = shader_crusher::shadercrusher_get_ouput( pShaderCrusher );
fragmentString = std::string( pOutput );
shader_crusher::shadercrusher_free_ouput( pShaderCrusher, pOutput );
shader_crusher::shadercrusher_free( pShaderCrusher );

别忘了包含 cbindgen 生成的头文件,并链接到库。

统计信息

我目前只在我的着色器上使用它,但平均压缩大小为 60%,如果进一步压缩(例如,使用 UPX/Crinkler/kkrunchy),则为 40%。

很快

(因为我想要它)

  • 允许通过 c-api 列出黑名单。
  • 添加输出验证。
  • 与 piglet 套件进行测试。
  • 带有测试的 CI 系统

未来

(即不会在不久的将来发生)

  • 删除死代码
  • 智能替换重复块
  • 多着色器遍历以智能提取共享代码

帮助

  • 将此应用于您的着色器,并查看是否破坏了任何内容,以及您获得的压缩率。
  • 修复 glsl crate 中的 #52 (括号太多)。
  • 修复 glsl crate 中的 #110 (定义中的空白)。
  • 交错黑名单完全错误,但暂时可以完成工作。
  • '#define' 可以修复,但我太懒了。

依赖关系

~6MB
~105K SLoC