И.В. Дикан, Ю.С. Белов
2
void drawOldWay(ref const Vertex[] vertices) { // ста-
рый стиль отрисовки
Begin(GL_TRIANGLES);
foreach(v; vertices)
// все вертексы каждый раз передаются
// из оперативной памяти в память GPU
Vertex3f(v.x, v.y, v.z);
End();
}
uint createVBO(ref const Vertex[] vertices) {// функ-
ция создания VBO
uint id;
// создаётся буфер
GenBuffers(1, &id);
// привязывается к текущему контексту
BindBuffer(GL_ARRAY_BUFFER, id);
// данные загружаются в быструю память GPU
BufferData(GL_ARRAY_BUFFER,
Vertex.sizeof * vertices.length, vertices.ptr,
GL_STATIC_DRAW);
return id;
}
void bindVBO(uint id) {
// включается нулевой атрибут,
// по которому обычно располагаются координаты
EnableVertexAttribArray(0);
BindBuffer(GL_ARRAY_BUFFER, id);
// OpenGL уведомляется о содержимом буфера
VertexAttribPointer(
0, // номер атрибута (обычно это 0)
3, // количество элементов
GL_FLOAT,// тип элементов
GL_FALSE,// элементы не нуждаются в нормализации
0, // все элементы идут друг за другом
null // базовое смещение отсутствует
);
}
void unbindVBO() { DisableVertexAttribArray(0); }
void drawNewWay(uint id, uint count) { // отрисовка с
использованием VBO
bindVBO(); // прикрепление VBO
DrawArrays(GL_TRIANGLES, 0, count); // отрисовка тре-
угольников
// отвязка VBO, так как оно более не используется
unbindVBO();
}
Если набор буферов при рисовании с использованием VBO по-
стоянен, то лучше применять ARB_vertex_array_object (VAO). По
аналогии с display lists VAO позволяет «записать» последователь-
ность команд для рендеринга и затем «воспроизвести» их, т. е.