在glLinkProgram之前或之后的OpenGL - glUniformBlockBinding?

时间:2014-07-17 21:01:17

标签: c++ opengl

我正在尝试使用统一缓冲区对象来分享不同着色器的投影矩阵(例如,实体对象的延迟传递和透明对象的传递传递)。我认为,随着复杂性的增长,我将在稍后向UBO添加更多数据。我的问题是红皮书说:

  

要显式控制统一块的绑定,请在调用 glLinkProgram()之前调用 glUniformBlockBinding()

但是online documentation说:

  

当程序对象被链接或重新链接时,分配给每个活动统一块的统一缓冲区对象绑定点将重置为零。

我错过了什么?我应该在链接之后或之前绑定统一块吗?

感谢。

1 个答案:

答案 0 :(得分:2)

glUniformBlockBinding​需要程序名称和索引在此特定程序中找到块的位置。

 void glUniformBlockBinding​( GLuint program​, GLuint uniformBlockIndex​, GLuint uniformBlockBinding​ );

uniformBlockIndex​可以通过在程序上调用glGetUniformBlockIndex来获得。

 GLuint glGetUniformBlockIndex​( GLuint program​, const char *uniformBlockName​ );

从API(http://www.opengl.org/wiki/GLAPI/glGetUniformBlockIndex):

  

程序必须是程序对象的名称,过去必须为其调用命令glLinkProgram,尽管glLinkProgram不一定要求成功。该链接可能已失败,因为活动制服的数量超过了限制。

所以正确的顺序是:

void glLinkProgram(GLuint program​);
GLuint glGetUniformBlockIndex​( GLuint program​, const char *uniformBlockName​ );
void glUniformBlockBinding​( GLuint program​, GLuint uniformBlockIndex​, GLuint uniformBlockBinding​ );