我正在尝试使用统一缓冲区对象来分享不同着色器的投影矩阵(例如,实体对象的延迟传递和透明对象的传递传递)。我认为,随着复杂性的增长,我将在稍后向UBO添加更多数据。我的问题是红皮书说:
要显式控制统一块的绑定,请在调用 glLinkProgram()之前调用 glUniformBlockBinding()。
当程序对象被链接或重新链接时,分配给每个活动统一块的统一缓冲区对象绑定点将重置为零。
我错过了什么?我应该在链接之后或之前绑定统一块吗?
感谢。
答案 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 );