diff --git a/include/Buffers.h b/include/Buffers.h index 856d3c2..c230d4e 100644 --- a/include/Buffers.h +++ b/include/Buffers.h @@ -24,6 +24,7 @@ class VAO // Тип буфера enum BUFFER_TYPE { VERTEX = GL_ARRAY_BUFFER , ELEMENT = GL_ELEMENT_ARRAY_BUFFER + , UNIFORM = GL_UNIFORM_BUFFER }; // Объект вершинного буфера @@ -37,9 +38,20 @@ class BO void load(const void *data, int size, GLuint mode = GL_STATIC_DRAW); // Загрузка вершин в void use(); - private: + protected: GLuint handler; // Дескриптор BUFFER_TYPE type; // Тип буфера }; +// Объект uniform-буфера +class UBO : public BO +{ + public: + UBO(int size, int binding); // Создает пустой uniform-буфер заданного размера с автоматической привязкой + UBO(const void *data, int size, int binding); // Создает пустой uniform-буфер заданного размера с автоматической привязкой + + void rebind(int binding); // Перепривязка + void loadSub(const void *data, int size, int offset = 0); // Загрузка с отступом +}; + #endif // BUFFERS_H diff --git a/src/Buffers.cpp b/src/Buffers.cpp index 47ca7a7..7d27343 100644 --- a/src/Buffers.cpp +++ b/src/Buffers.cpp @@ -56,6 +56,7 @@ BO::~BO() // Загрузка вершин в буфер void BO::load(const void *data, int size, GLuint mode) { + use(); glBufferData(type, size, data, mode); } @@ -63,3 +64,28 @@ void BO::use() { glBindBuffer(type, handler); // Привязка элементного буфера } + +// Создает пустой uniform-буфер заданного размера с автоматической привязкой +UBO::UBO(int size, int binding) : BO(UNIFORM, 0, size, 0) +{ + rebind(binding); +} + +// Создает пустой uniform-буфер заданного размера с автоматической привязкой +UBO::UBO(const void *data, int size, int binding) : BO(UNIFORM, data, size, 0) +{ + rebind(binding); +} + +// перепривязка +void UBO::rebind(int binding) +{ + glBindBufferBase(type, binding, handler); +} + +// Загрузка с отступом +void UBO::loadSub(const void *data, int size, int offset) +{ + use(); + glBufferSubData(type, offset, size, data); +}