我一直在谷歌搜索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)机器上使用它们。
答案 0 :(得分:11)
(1)格式数/代码代表什么?
它们代表唯一标识符。
(2)是否有标准的ARB二进制格式,或者它们是否都依赖于供应商?
它们都是供应商特定的。
(3)供应商之间是否存在通用格式?
没有
(4)如果有多种格式,你应该如何在它们之间做出选择?
你没有。您无法选择格式。当您调用glGetProgramBinary
时,您将获得由驱动程序决定的特定格式的二进制数据。当您load that program later时,您必须使用二进制数据传递该特定格式。
我有一种模糊的感觉,我必须在给定的机器上预编译和缓存着色器才能利用这一点。
是的,这就是该功能的目的:允许您缓存着色器编译。但是,如果驱动程序的着色器版本更改,则必须始终确保程序正常工作(因此与创建缓存版本时不同)。所以你仍然需要能够从文本形式重建着色器。