144 lines
3.9 KiB
C++
144 lines
3.9 KiB
C++
#include "Buffers.h"
|
||
|
||
// Создает VAO и активирует его
|
||
VAO::VAO()
|
||
{
|
||
glGenVertexArrays(1, &handler); // Генерация одного объекта массива вершин
|
||
glBindVertexArray(handler); // Привязка для использования
|
||
}
|
||
|
||
// Уничтожает VAO
|
||
VAO::~VAO()
|
||
{
|
||
glDeleteVertexArrays(1, &handler);
|
||
}
|
||
|
||
// Активация VAO
|
||
void VAO::use()
|
||
{
|
||
glBindVertexArray(handler); // Привязка VAO для использования
|
||
}
|
||
|
||
// Деактивация активного VAO
|
||
void VAO::disable()
|
||
{
|
||
glBindVertexArray(0); // Отключение VAO
|
||
}
|
||
|
||
// возвращает дескриптор
|
||
GLuint VAO::get_handler()
|
||
{
|
||
return handler;
|
||
}
|
||
|
||
// Создает пустой буфер, привязывает к активному VAO, если нужно конфигурирует атрибуты
|
||
BO::BO(BUFFER_TYPE t, void (*attrib_config)()) : type(t)
|
||
{
|
||
glGenBuffers(1, &handler); // Генерация одного объекта буфера вершин
|
||
glBindBuffer(type, handler); // Привязка элементного буфера
|
||
|
||
if (attrib_config)
|
||
attrib_config();
|
||
}
|
||
|
||
// Создает буфер, привязывает к активному VAO и загружает туда данные, если нужно конфигурирует атрибуты
|
||
BO::BO(BUFFER_TYPE t, const void *data, int size, void (*attrib_config)()) : BO(t, attrib_config)
|
||
{
|
||
load(data, size);
|
||
}
|
||
|
||
// Уничтожает буфер
|
||
BO::~BO()
|
||
{
|
||
glDeleteBuffers(1, &handler);
|
||
}
|
||
|
||
// Загрузка вершин в буфер
|
||
void BO::load(const void *data, int size, GLuint mode)
|
||
{
|
||
use();
|
||
glBufferData(type, size, data, mode);
|
||
}
|
||
|
||
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);
|
||
}
|
||
|
||
// Создает буфер кадра с нужным числом прикреплений текстур
|
||
FBO::FBO(GLuint *attachments, int count)
|
||
{
|
||
glGenFramebuffers(1, &handler);
|
||
use();
|
||
glDrawBuffers(count, attachments);
|
||
}
|
||
|
||
// Уничтожение буфера
|
||
FBO::~FBO()
|
||
{
|
||
glDeleteFramebuffers(1, &handler);
|
||
}
|
||
|
||
// Активирует буфер кадра в заданном режиме
|
||
void FBO::use(GLuint mode)
|
||
{
|
||
glBindFramebuffer(mode, handler);
|
||
}
|
||
|
||
// Активирует базовый буфер в заданном режиме
|
||
void FBO::useDefault(GLuint mode)
|
||
{
|
||
glBindFramebuffer(mode, 0);
|
||
}
|
||
|
||
// Привязка рендер буфера
|
||
void FBO::assignRenderBuffer(GLuint hander, GLuint attachment)
|
||
{
|
||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, hander);
|
||
}
|
||
|
||
// Создает буфер рендера с заданными параметрами размеров и используемых компонент
|
||
RBO::RBO(int w, int h, GLuint component)
|
||
{
|
||
glGenRenderbuffers(1, &handler);
|
||
glBindRenderbuffer(GL_RENDERBUFFER, handler);
|
||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h);
|
||
}
|
||
|
||
// Уничтожение буфера
|
||
RBO::~RBO()
|
||
{
|
||
glDeleteRenderbuffers(1, &handler);
|
||
}
|
||
|
||
// Возвращает дескриптор буфера рендера
|
||
GLuint RBO::getHandler()
|
||
{
|
||
return handler;
|
||
}
|