0

以下 StackOverflow 响应解释了在将着色器源代码引入应用程序后从着色器获取源代码的几种不同方法。虽然,通常人们并不担心着色器代码被读取(因此大部分是文本文件读取),但有时我们会担心。

从 GLProgram 检索着色器源代码

因此,如果我们关心保持 Shader 源代码不被读取,那么实际上可以采取什么方法来防止这种情况呢?我并不特别希望浏览着色器代码中正在执行的操作。如果希望隐藏某些数学组件,那么我是否必须将它们从着色器源中拉出并在代码中本地执行?

编辑:

虽然我知道想要通过足够的努力从某事中获取信息的人可能会完成这项任务,但让这些任务成为一件不平凡的事情总是很好的。

4

3 回答 3

3

不过,这里提出的问题是针对使用相同 EGLContext 的人。它将是返回程序代码的库的一部分,该程序代码与用户现有的纹理一起使用。它将保护所有使用该库的用户免于查看代码。

所以你想保护你的程序不受自身的影响。感谢 OpenGL 的着色器编译/链接模型恰好允许您这样做。因为如果它以任何其他方式定义,你就不能这样做。

您可以使用着色器/程序区别。链接程序对象后,您用于构建它的着色器对象完全无关紧要。您可以通过调用来glDetachShader分离它们。然后您可以删除着色器并返回程序。

确实,您应该始终这样做;否则,OpenGL 将保留着色器字符串的无意义副本,直到您删除程序。

于 2013-05-17T12:44:27.727 回答
1

您可以插入占位符并在运行时替换它们。但不管你做什么,如果有人真的对你的代码感兴趣,他们最终会阅读它。

编辑:另一个我刚才也想到的选择是使用预编译的着色器,使用glShaderBinary. 但这可能是相同的,只是对攻击者多一步,并且并非所有平台都返回任何受支持的二进制格式(GL_NUM_SHADER_BINARY_FORMATS)。

只是说清楚,这不值得你花时间,你的程序中可能还有其他领域你应该花时间。

于 2013-05-17T11:38:32.697 回答
1

与 CPU 应用程序二进制文件不同,GPU 着色器二进制文件兼容性仍处于起步阶段,因为指令集尚未标准化。可以在许多 GPU 上使用二进制着色器程序,但不同设备之间的可移植性(即使是包含同一公司的 GPU IP 的设备)可能会很棘手。

如何在我的应用程序中使用 GLSL ES 着色器二进制文件?” PowerVR Insider 网站上的常见问题解答项目详细介绍了在 PowerVR 设备上使用二进制着色器的技术挑战。

于 2013-06-24T11:53:15.450 回答