构建比 Microsoft 更好的 DirectX 着色器编译器?
一项开源工作正在重新实现 Microsoft 的 DirectX 着色器编译器和 DXIL“签名”,因其能免去捆绑 Microsoft 专有 `dxil.dll` 而受到关注,这也给 Godot 引擎和跨平台工具链等项目带来了麻烦。评论者指出,Direct3D、Vulkan 和 Metal 之间的着色器编译本就是一个脆弱且由厂商控制的混乱生态,并认为 Mach/Zig 朝着跨 API、跨操作系统着色器工具链迈进的工作,可能会对游戏开发产生变革性影响。讨论还涉及法律与许可限制、以可见源码替代不透明 DLL 的优势,以及像 Wine/Proton 这样的层已经成为 Linux 游戏事实上的稳定性和兼容性目标。
Godot、dxil.dll 和许可证
- Godot 对 D3D12 的支持依赖于 Microsoft 专有的
dxil.dll,这与其避免捆绑闭源组件的目标相冲突。 - 一些用户认为最终用户“只想东西能用”,并不在乎驱动/库是否为专有;另一些人则强烈倾向于避免专有驱动和二进制黑盒。
- 专有部分具体是
dxil.dll/libdxil.so这个“签名”库,它作为二进制黑盒附带单独许可证;其源码不在 DXC 仓库中。 - 讨论强调,真正的阻碍是法律限制(例如点击同意要求、不可再分发条款),而不只是意识形态。
跨 API 着色器编译与 Mach/Zig
- Direct3D、Vulkan 和 Metal 之间的底层着色器生态被描述为一团糟,尤其是在交叉编译方面。
- Metal 着色器编译被 Apple 的专有编译器锁定,只能在 macOS 上使用,较新情况下也可在 Windows 上使用;Linux 主机若不做逆向工程,无法直接面向 Metal 目标编译。
- Mach 将 Zig 用作跨 API 着色器编译器和工具链的愿景,被认为如果能达到 Zig 跨平台编译故事的成熟度,可能会带来变革。
Microsoft 的激励与平台动态
- 有人认为 Microsoft 因为市场主导地位和锁定效应,没有多少动力改进软件;也有人反驳说,其内部游戏工作室依赖这些工具,因此质量仍然很重要。
- 关于 Valve 的 Proton/Wine 也有长篇争论:
- 一方认为 Proton 会抑制原生 Linux 移植,因为“只支持 Windows”就足够了。
- 另一方认为,鉴于 ABI 稳定性差和碎片化(glibc 版本、图形栈、Wayland 等),Proton 恰恰是让 Linux 游戏可行的关键。
- 多条评论将 Win32 描述为通过 Wine 在 Linux 上事实上的唯一长期稳定的二进制图形 API。
DXIL“签名”和逆向工程
- DXIL 的“签名”步骤被嘲讽为安全戏法;其他图形 API 无需它也能工作。
- 复现出的签名看起来只是经过轻微修改的 MD5 风格哈希;类似实现此前已经存在(例如在调试工具中)。
- 有人猜测作者没有明确描述 RE 过程,是为了保留法律上的可辩护空间,尽管也有人指出,出于互操作性目的的逆向工程通常是站得住脚的。
SPIR-V、着色器语言与工具链
- 有人主张采用类似 HLSL/GLSL → SPIR-V ↔ DXIL 的流水线,利用 SPIR-V 作为通用 IR。
- 对 SPIR-V→DXIL 的转换很感兴趣(提到了 Mesa 的
spirv2dxil),也提到了现有的 DXIL→SPIR-V(vkd3d)。 - 一位评论者认真建议直接用 SPIR-V 编写着色器,以获得更好的跨驱动预测性,尽管作者成本更高。
- 有人对 LLVM/C++ 依赖的“臃肿”表示不满,并希望有基于纯 C99、更简洁的编译器。
发布 dxil.dll vs 开源实现
- 有人指出,很多游戏已经捆绑了大量专有 DLL,因此额外加入
dxil.dll实际上问题不大。 - 反对意见包括:
- 对小型游戏/工具来说,体积和依赖膨胀很重要。
- 仅二进制依赖会让工具链升级、交叉编译以及向新的主机/目标平台移植变得更复杂。
- 拥有所有源码能带来更多控制权,并减少长期集成麻烦。
其他相关话题
- SDL 正在开发
SDL_gpu,作为跨平台图形抽象和着色器层;与 WebGPU 的比较引发了对 WebGPU 复杂性以及其网络安全开销的担忧。 - 有报告称 Halo CE 在 Apple Silicon 上通过 Wine 运行效果很差,因此有人建议尝试 Apple 的 Game Porting Toolkit(D3D→Metal)。
- 多条评论称赞 Mach/Zig 生态(例如 mach-sysgpu/WebGPU 重实现)以及推动更好图形工具的整体“基础设施工作”。
- 据说 Microsoft 对其 DXC 分支损害了 LLVM 的部分代码生成;Microsoft 已明确表示他们不会在 DXC 中恢复 DXBC 生成,而可能在之后通过 upstream Clang 支持它,前提是先专注于 DXIL 和 SPIR-V。