【问题标题】:Saving/Loading compiled webgl shaders保存/加载编译的 webgl 着色器
【发布时间】:2016-03-16 08:13:45
【问题描述】:

我还没有找到任何明确的答案,所以决定在这里问。真的没有办法保存和加载已编译的 webgl 着色器吗?每次有人加载页面时编译着色器似乎是一种浪费,而您所要做的就是编译一次着色器,将其保存到文件中,然后加载编译后的着色器对象,就像 HLSL 一样(我知道这不是GLSL,但我对 OpenGL 还是有点陌生​​)。

那么,如果可能的话,我如何在 webgl 中保存和加载已编译的着色器?

【问题讨论】:

    标签: webgl


    【解决方案1】:

    真的没有办法,恕我直言,这是件好事。除了更新驱动程序时,预编译的着色器可能会丢失新的优化或只是中断,它还会带来安全问题(向 GPU 提供任意字节码)。

    当您只需编译一次着色器,将其保存到文件中,然后加载编译后的着色器对象,就像 HLSL 一样

    OpenGL(及其衍生产品)不像 DirectX 那样支持加载预编译的着色器:

    程序二进制格式旨在传输。期望不同的硬件供应商接受相同的二进制格式是合理的。期望同一供应商的不同硬件接受相同的二进制格式是合理的。 https://www.opengl.org/wiki/Shader_Compilation#Binary_limitations

    在 OpenGL 中似乎没有像 SPIR-V 这样的中间格式,因此您需要在目标平台上编译着色器,这会导致用户更换显卡/采用混合图形解决方案、存储限制等诸多额外问题在客户端上(使用localstorage 5 MB)以及滥用它对硬件进行指纹识别的可能性。

    【讨论】:

    • 不小心删除了最后一条评论。只是想说你的权利,你不能像 hlsl 那样预编译 glsl 程序(来自这里的 directx 背景)。我已经编辑了我的问题以删除“就像在任何其他图形 api 中一样”的误导性陈述
    • "程序二进制格式不打算传输。期望不同的硬件供应商接受相同的二进制格式是不合理的。期望来自同一供应商的不同硬件接受相同的二进制格式。”谁说的?那些不能执行的? You can also precompile shaders in Vulkan, btw
    • 程序二进制文件是经过预处理的源代码,可以在任何可以通过硬件本身解释字节码或利用解释器源代码解释字节码的硬件上运行。所以,不,程序二进制不一定是硬件供应商特定的字节码。它只是编译的源代码,在编译步骤中可以检测到很多错误和错误。最后,唯一的区别是一个(编译后的代码)比另一个更可靠,测试也更好。
    • @PabloAriel 好吧,我猜everybody 包括the official spec(第 131 页)“如果实现确定硬件或软件发生了变化,加载程序二进制文件也可能失败生成程序二进制文件时的配置,例如使用不兼容或过时的编译器版本进行编译” 那就错了。明白了!
    • @PabloAriel 我只是在陈述事实,我不知道你在执行什么任务,但它完全不合适且离题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-03-24
    相关资源
    最近更新 更多