#shader #metal #glsl #transpiler #version #msl #compiler

shadermagic

伪 GLSL 到 MSL 和 GLSL 转换器

2 个版本

0.1.2 2024 年 6 月 21 日
0.1.0 2023 年 9 月 19 日

#369图形 API


用于 nanogltf

MIT/Apache

24KB
490

shadermagic

shadermagic 是我希望存在的 crate。想想 Therkla 的 hlslparser,但是 Rust 原生。

shadermagic 假装 是从伪 GLSL 到不同的 GLSL 变体和 Metal 的 MSL 的编译器。

如果您想找到真正能工作的东西,请查看 nagaspirvcrosssokol-shdcglslangglslcchlsl parserhlslparser fork 或者甚至是 nanoshredder

另一个相关的案例研究是 这个 emscripten 攻击shadermagic 是这个想法的略微高级版本。

shadermagic 接受 一些未记录的几乎 #version 130 着色器,并应用大量 String::replace 来生成 plain version 100version 100 with webgl1 extensions130330300 esmetal's MSL

Metal 是一个有点特殊的情况,在其之上有一些额外的代码在 String::replace 之上。但它仍然是非常简单的字符串操作。《shadermagic》对 AST 和着色器语义一无所知。

shadermagic 在任意 glsl 输入上都不会工作得很好。再多的 string::replace 也无法替代编译器。然而,为 shadermagic 设计特定的着色器可能是可能的,这可能比为每个目标手动编写的工作要少。或者也可能不是!我真心希望我在这里给出了足够的警告。

如何使 glsl->metal 工作起来

足够多的警告了,以下是一些让这堆破解方法浮出水面的技巧

  • 不要在 main() 函数外部访问 uniform,将它们作为参数传递。
  • 将主函数放在着色器的最后,在所有其他内容之后
  • 在顶点着色器中用 // [[attribute(N)]] 注释属性
  • 在顶点/片段着色器中用 // [[user(locnN)]] 注释 varying
  • 避免在顶点/片段着色器中有相同名称的函数
  • 记住,String::replace 非常愚蠢,不考虑任何上下文。避免使用像 "mymat3" 这样的名称,避免使用像 "BaseColor" 和 "Color" 这样的名称。是的,这真的很糟糕。
  • 避免使用 .s/.t/.p/.q,改用 .x/.y/.z/.w

依赖项

~0.9–1.6MB
~38K SLoC