2 个版本
0.1.2 | 2024 年 6 月 21 日 |
---|---|
0.1.0 | 2023 年 9 月 19 日 |
#369 在 图形 API
用于 nanogltf
24KB
490 行
shadermagic
shadermagic
是我希望存在的 crate。想想 Therkla 的 hlslparser,但是 Rust 原生。
shadermagic
假装 是从伪 GLSL 到不同的 GLSL 变体和 Metal 的 MSL 的编译器。
如果您想找到真正能工作的东西,请查看 naga,spirvcross,sokol-shdc,glslang,glslcc,hlsl parser,hlslparser fork 或者甚至是 nanoshredder。
另一个相关的案例研究是 这个 emscripten 攻击。 shadermagic
是这个想法的略微高级版本。
shadermagic
接受 一些未记录的几乎 #version 130 着色器,并应用大量 String::replace
来生成 plain version 100
,version 100 with webgl1 extensions
,130
,330
,300 es
和 metal'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