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