0%

ubo

Uniform Buffer Object


//vert1.vs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#version 330 core
layout (location = 0) in vec3 aPos;

uniform mat4 model;

layout (std140) uniform Matrices
{
mat4 projection;
mat4 view;
};

void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
}

//vert2.vs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#version 330 core
layout (location = 0) in vec3 aPos;

layout (std140) uniform Matrices
{
mat4 projection;
mat4 view;
};

uniform mat4 model;

void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//uniformBlockBinding < GL_MAX_UNIFORM_BUFFER_BINDINGS
uniformBlockBindingID = 10;
//创建buffer
unsigned int uboMatrices;
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);

// define the range of the buffer that links to a uniform binding point
glBindBufferRange(GL_UNIFORM_BUFFER, uniformBlockBindingID, uboMatrices, 0, 2 * sizeof(glm::mat4));

//获取uboindex,并uboindex绑定uniformBlockBinding
unsigned int uniformBlockIndex1 = glGetUniformBlockIndex(program1, "Matrices");
glUniformBlockBinding(program1, uniformBlockIndex1, uniformBlockBindingID);

//获取uboindex,并uboindex绑定uniformBlockBinding
unsigned int uniformBlockIndex2 = glGetUniformBlockIndex(program2, "Matrices");
glUniformBlockBinding(program2, uniformBlockIndex2, uniformBlockBindingID);

// store the projection matrix (we only do this once now) (note: we're not using zoom anymore by changing the FoV)
glm::mat4 projection = glm::perspective(45.0f, (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projection));

Function Definition

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

program

The name of a program object containing the active uniform block whose binding to assign.

uniformBlockIndex

The index of the active uniform block within program​ whose binding to assign.

uniformBlockBinding

Specifies the binding point to which to bind the uniform block with index uniformBlockIndex​ within program​.

Description

Binding points for active uniform blocks are assigned using glUniformBlockBinding. Each of a program’s active uniform blocks has a corresponding uniform buffer binding point. program​ is the name of a program object for which the command glLinkProgram has been issued in the past.

If successful, glUniformBlockBinding specifies that program​ will use the data store of the buffer object bound to the binding point uniformBlockBinding​ to extract the values of the uniforms in the uniform block identified by uniformBlockIndex​.
When a program object is linked or re-linked, the uniform buffer object binding point assigned to each of its active uniform blocks is reset to zero.


参考