I'm learning OpenGL and I'm trying to understand things properly. If my understanding is incorrect at any point, please correct me.
Introduction
So let's say we have a triangle. This triangle has its vertices. Let's say these vertices only have the position set - no color, not anything else. These vertices are passed to the shaders using a buffer - let's call it VB (VBO in tutorials).
The shaders are the following:
Vertex shader:
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
Fragment shader:
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
The VB is an non-formatted array of data. For example, if we wanted to pass 3 one-byte values to this buffer (0, 255, 16), the data would look like this:
00FFF0
However, the shaders do not know how to read the data, so we need to "instruct" them by telling them what is what. To do this we use Vertex Array Objects. Let's call our Vertex Array Object VA.
To pass data to the buffer, glBufferData
is used. When calling the function like this:
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
We inform OpenGL that we want to buffer sizeof(vertices)
elements from array vertices
to the buffer currently bound to GL_ARRAY_BUFFER
for static drawing.
Then, we inform VA how to use the data like this:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
This way we tell VA to get 3 floating point values from active buffer at the offset 0 while not normalizing coordinates and set this data to the vertex attribute at location 0.
This way, the shaders finally get all the data they need to work and our triangle is drawn.
Question
However, what if we wanted to change one vertex after we've already passed the data to the buffer?
In my understanding, we'd need to call glBufferData
the same way as before. But how does it influence the data that was originally in the buffer? Does it overwrite it?
If it does overwrite it, how do we pass another data, let's say colors, without overwriting the positions?
If it doesn't, how does VA know the data it's "pointing" to is no longer up to date?