如何将均匀缓冲区对象与Shader链接

gwo2fgha  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(165)

我正在创建一个UBO。

glGenBuffers(1, &uboMatrices);
glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices);
glBufferData(GL_UNIFORM_BUFFER, 2 * sizeof(glm::mat4), NULL, GL_STATIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
glBindBufferRange(GL_UNIFORM_BUFFER, 0, uboMatrices, 0, 2 * sizeof(glm::mat4));

更新数据

glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projection));
glBindBuffer(GL_UNIFORM_BUFFER, 0);

glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices);
glBufferSubData(GL_UNIFORM_BUFFER, sizeof(glm::mat4), sizeof(glm::mat4), glm::value_ptr(view));
glBindBuffer(GL_UNIFORM_BUFFER, 0);

有必要做这一步吗?

unsigned int uniformIndexMyShader1    = glGetUniformBlockIndex(MyShader1.ID, "Matrices");
glUniformBlockBinding(MyShader1.ID,    uniformIndexMyShader1, 0);

如果没有这一点,所有着色器都将使用投影和视图矩阵进行更新。

0dxa2lsx

0dxa2lsx1#

根据OpenGL 4.6标准,第7.6.3节:
程序的每个活动统一块都有一个对应的统一缓冲区对象绑定点。绑定是在链接或重新链接程序时建立的,绑定的初始值由布局限定符(如果存在)指定,否则为零。可以通过调用void UniformBlockBinding(uint程序,uint uniformBlockIndex,uint uniformBlockBinding)来分配绑定点;

因此,如果在着色器中指定绑定(通过布局),则似乎不需要显式调用glUniformBlockBinding。如果未在着色器中指定绑定,则标准似乎是说所有统一块都与绑定点零相关联。如果这是您所期望的,那么调用glUniformBlockBinding不会有什么坏处,但它也不会改变任何事情。

请注意,您必须在链接程序之前建立绑定。

相关问题