是否有任何图形 API 实施着色器混淆?

Does any graphics API implement shader obfuscation?

假设一家公司在他们的应用程序中实施了一种新颖的着色器,并且他们想让它难以被窃取。但是,OpenGL 着色器以明文形式发送到 GPU,Vulkan 很容易接受 。是否有任何图形 API 具有非零级别的着色器混淆?

Does any graphics API have a non-zero level of shader obfuscation?

没有。这没有任何意义。着色器并不像成熟的应用程序那么复杂。着色器可能达到的复杂性有相当严格的限制以允许保持交互性。任何一种混淆层,在深处,都只是一个奇怪的指令集,可以使用优化 compiler/transpiler.

轻松反混淆

一般规则是:如果可以执行并产生可读的结果*,则可以对其进行反混淆处理。就这么简单。

此外,熟练的图形黑客将能够查看最终渲染 and/or 中间结果(可以使用 renderdoc 等工具轻松获得)并从中找出着色器的要点.哎呀,90% 的图形编码都包含这种视觉输出调试,当您试图弄清楚为什么以及如何您的着色器不符合您的要求时,以及您在屏幕上看到的混乱是如何首先发生的。因此,任何有经验的图形黑客都已经掌握了对着色器进行逆向工程所需的大部分技能,只需 "looking" 就可以了。


* 如果不是 "readable result" 的约束,那么 Homomorphic Encryption 可能允许真正的代码混淆。但是您通常希望人类可读的着色器输出。

我认为最好的解决方案是将代码从 GPU 移至 CPU。不幸的是,这意味着性能下降。

如果您将所有重要逻辑都放在 GPU 上,那么人们实际上可以将其用于自己的产品中。改变周围的事物以防止版权主张是微不足道的。

除了尝试将重要代码保留在 CPU 上之外,您无能为力,即使这意味着游戏速度变慢。