Я изучаю OpenGL, и я пытаюсь понять вещи правильно. Если мое понимание неверно в каком-либо пункте, поправьте меня.
Введение
Итак, допустим, у нас есть треугольник. Этот треугольник имеет свои вершины. Скажем, у этих вершин задана только позиция — ни цвета, ни чего-либо еще. Эти вершины передаются шейдерам с помощью буфера — назовем его VB (VBO в учебниках).
Шейдеры следующие:
Вершинный шейдер:
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
Фрагментный шейдер:
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
VB представляет собой неформатированный массив данных. Например, если бы мы хотели передать в этот буфер 3 однобайтовых значения (0, 255, 16), данные выглядели бы так:
00FFF0
Однако шейдеры не умеют читать данные, поэтому нам нужно проинструктировать их, сказав, что есть что. Для этого мы используем Vertex Array Objects. Назовем наш объект Vertex Array VA.
Для передачи данных в буфер используется glBufferData
. При вызове функции следующим образом:
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
Мы сообщаем OpenGL, что хотим буферизовать sizeof(vertices)
элементов из массива vertices
в буфер, привязанный к GL_ARRAY_BUFFER
для статического рисования.
Затем мы сообщаем VA, как использовать данные следующим образом:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
Таким образом, мы говорим VA получить 3 значения с плавающей запятой из активного буфера по смещению 0, не нормализуя координаты, и установить эти данные в атрибут вершины в местоположении 0.
Таким образом, шейдеры, наконец, получат все данные, необходимые им для работы, и наш треугольник будет нарисован.
Вопрос
Однако что, если мы хотим изменить одну вершину после того, как мы уже передали данные в буфер?
Насколько я понимаю, нам нужно вызывать glBufferData
так же, как и раньше. Но как это влияет на данные, которые изначально были в буфере? Он перезаписывает его?
Если он перезапишет его, как нам передать другие данные, скажем, цвета, не перезаписывая позиции?
Если нет, то как VA узнает, что данные, на которые он указывает, больше не актуальны?