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

时间:2013-04-09 11:03:20

标签: opengl binary shader

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

::glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, &values[0]);

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

::glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &value);

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

所以我的问题如下:

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

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

1 个答案:

答案 0 :(得分:11)

  

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

它们代表唯一标识符。

  

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

它们都是供应商特定的。

  

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

没有

  

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

你没有。您无法选择格式。当您调用glGetProgramBinary时,您将获得由驱动程序决定的特定格式的二进制数据。当您load that program later时,您必须使用二进制数据传递该特定格式。

  

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

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