我正在创建一个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);
如果没有这一点,所有着色器都将使用投影和视图矩阵进行更新。
1条答案
按热度按时间0dxa2lsx1#
根据OpenGL 4.6标准,第7.6.3节:
程序的每个活动统一块都有一个对应的统一缓冲区对象绑定点。绑定是在链接或重新链接程序时建立的,绑定的初始值由布局限定符(如果存在)指定,否则为零。可以通过调用void UniformBlockBinding(uint程序,uint uniformBlockIndex,uint uniformBlockBinding)来分配绑定点;
因此,如果在着色器中指定绑定(通过布局),则似乎不需要显式调用glUniformBlockBinding。如果未在着色器中指定绑定,则标准似乎是说所有统一块都与绑定点零相关联。如果这是您所期望的,那么调用glUniformBlockBinding不会有什么坏处,但它也不会改变任何事情。
请注意,您必须在链接程序之前建立绑定。