7

我一直在搜索 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)机器上使用它们。

4

1 回答 1

11

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

它们代表唯一标识符。

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

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

(3) 供应商之间是否有共同的格式?

不。

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

You don't. You don't get a choice of formats. When you call glGetProgramBinary, you get binary data in a particular format decided by the driver. When you load that program later, you must pass that specific format with the binary data.

I have a vague feeling I have to pre-compile and cache shaders on a given machine in order to take advantage of this.

Yes, that's the purpose of the feature: to allow you to cache shader compilation. But you must always make sure that your program will work if the driver's shader version changes (and therefore is different from when you created the cached version). So you'll still need to be able to rebuild the shaders from the textual form.

于 2013-04-09T11:22:50.293 回答