以下StackOverflow响应说明了在将着色器源代码引入应用程序后从着色器获取源代码的几种不同方法。虽然,通常人们不担心着色器代码被读取(因此大部分文本文件都是读取的),偶尔我们也会这样。
Retrieving Shader Source Code from GLProgram
因此,如果我们关注保持Shader源代码不被读取,那么实际上可以采取什么方法来防止这种情况?我并不特别想要浏览着色器代码中的内容。如果希望隐藏某些数学组件,那么我是否必须从着色器源中提取它们并在代码中本地执行它们?
修改
虽然我知道有人想要从有足够努力的东西中获取信息可能会完成任务,但总是很高兴能使这些任务变得微不足道。
答案 0 :(得分:3)
这里提出的问题是针对在同一个EGLContext上工作的人。它将成为库的一部分,返回与用户现有纹理一起使用的程序代码。这将是保护使用库的所有用户查看代码。
所以你想保护自己的程序。要感谢OpenGL的着色器编译/链接模型恰好允许您这样做。因为如果它是以任何其他方式定义的,你就不能这样做。
您可以使用着色器/程序区分。链接程序对象后,用于构建它的着色器对象完全无关紧要。您可以使用calls to glDetachShader
分隔它们。然后你可以删除着色器并返回程序。
确实,你应该总是这样做;否则,OpenGL将保留着色器字符串的无意义副本,直到您删除该程序。
答案 1 :(得分:1)
您可以插入占位符并在运行时更换它们。但无论你做什么,如果有人真的对你的代码感兴趣,他们最终会阅读它。
编辑:我现在也想到了另一个使用glShaderBinary
预编译着色器的选项。但它可能是相同的,只是攻击者的一步,而不是所有平台都返回任何支持的二进制格式(GL_NUM_SHADER_BINARY_FORMATS
)。
为了说清楚,不值得花时间,程序中可能还有其他方面你应该花时间。
答案 2 :(得分:1)
与CPU应用程序二进制文件不同,GPU着色器二进制兼容性仍然处于初期阶段,因为指令集尚未标准化。可以在许多GPU上使用二进制着色器程序,但不同设备之间的可移植性(即使是那些包含来自同一公司的GPU IP的设备)也可能很棘手。
PowerVR Insider网站上的"How can I use GLSL ES shader binaries in my application?"常见问题解答项目详细说明了在PowerVR设备上使用二进制着色器的技术挑战。