OpenGL二进制程序格式是否标准化?

Rob*_*son 7 opengl binary shader

我一直在谷歌搜索OpenGL二进制格式以及它们实际上是什么意思.到目前为止,我没有取得多大成功.我知道我可以获取如下数字和格式集:

::glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, &values[0]);
Run Code Online (Sandbox Code Playgroud)

,其中values是一个大小为整数的std :: vector:

::glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &value);
Run Code Online (Sandbox Code Playgroud)

对于我机器中的驱动程序,这将返回单个二进制格式.这只是一个数字而对我来说毫无意义.

所以我的问题如下:

(1)格式数/代码代表什么?(2)是否有标准的ARB二进制格式,或者它们是否都依赖于供应商?(3)供应商之间是否存在通用格式?(4)如果有多种格式,你应该如何在它们之间做出选择?

我有一种模糊的感觉,我必须在给定的机器上预编译和缓存着色器才能利用这一点.我的意思是它不像DX那样,你可以将着色器编译器作为后期构建事件运行并将它们打包在一起并在任何带有D3D的(Windows)机器上使用它们.

Nic*_*las 11

(1)格式数/代码代表什么?

它们代表唯一标识符.

(2)是否有标准的ARB二进制格式,或者它们是否都依赖于供应商?

它们都是特定于供应商的.

(3)供应商之间是否存在通用格式?

没有.

(4)如果有多种格式,你应该如何在它们之间做出选择?

你没有.您无法选择格式.当您调用时glGetProgramBinary,您将获得由驱动程序决定的特定格式的二进制数据.当你后来加载的程序,你必须通过特定格式的二进制数据.

我有一种模糊的感觉,我必须在给定的机器上预编译和缓存着色器才能利用这一点.

是的,这就是该功能的目的:允许您缓存着色器编译.但是,如果驱动程序的着色器版本发生更改(因此与创建缓存版本时不同),则必须始终确保程序正常工作.所以你仍然需要能够从文本形式重建着色器.