我还没有找到任何明确的答案,所以决定在这里提问。真的没有办法保存和加载已编译的 webgl 着色器吗?每次有人加载页面时都编译着色器似乎是一种浪费,当您所要做的就是编译一次着色器,将其保存到文件中,然后加载已编译的着色器对象,就像 HLSL(我知道它不是GLSL,但我对 OpenGL 还是有点陌生)。
那么,如果可能的话,我如何在 webgl 中保存和加载一个已编译的着色器?
确实没有办法,恕我直言,这是一件好事。除了更新驱动程序时,预编译着色器可能会丢失新的优化或只是中断之外,这还会带来安全问题(向 GPU 提供任意字节码)。
当您所要做的就是编译着色器一次,将其保存到文件中,然后加载编译后的着色器对象,就像 HLSL 一样
OpenGL(及其衍生产品)不支持像 DirectX 一样加载预编译着色器:
程序二进制格式不适合传输。期望不同的硬件供应商接受相同的二进制格式是不合理的。期望同一供应商的不同硬件接受相同的二进制格式 是不合理的。https://www.opengl.org/wiki/Shader_Compilation#Binary_limitations
OpenGL 中似乎没有像 SPIR-V 这样的中间格式,因此您需要在目标平台上编译着色器,这会带来很多额外的问题,例如用户更改显卡/采用混合图形解决方案、客户端的存储限制(使用localstorage为 5 MB )以及滥用它来对硬件进行指纹识别的可能性。