From 07a4d7d2cc3b8ee39e023f43ffcd5d2502a52759 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Mon, 14 Nov 2022 20:16:23 +0300 Subject: [PATCH] UBO --- include/Buffers.h | 14 +++++++++++++- src/Buffers.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) 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); +}