Классы VAO/VBO
This commit is contained in:
parent
ec163d242e
commit
f4bae02e78
|
@ -0,0 +1,50 @@
|
||||||
|
#ifndef BUFFERS_H
|
||||||
|
#define BUFFERS_H
|
||||||
|
|
||||||
|
#include <glad/glad.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
// Объект массива вершин
|
||||||
|
class VAO
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VAO(); // Создает VAO и активирует его
|
||||||
|
~VAO(); // Уничтожает VAO
|
||||||
|
VAO(const VAO & copy); // Конструктор копирования
|
||||||
|
VAO& operator=(const VAO & other); // Оператор присваивания
|
||||||
|
|
||||||
|
void use(); // Активация VAO
|
||||||
|
static void disable(); // Деактивация активного VAO
|
||||||
|
|
||||||
|
private:
|
||||||
|
GLuint handler; // Дескриптор
|
||||||
|
static std::map<GLuint, GLuint> handler_count; // Счетчик использований дескриптора
|
||||||
|
};
|
||||||
|
|
||||||
|
// Тип буфера
|
||||||
|
enum BUFFER_TYPE { VERTEX = GL_ARRAY_BUFFER
|
||||||
|
, ELEMENT = GL_ELEMENT_ARRAY_BUFFER
|
||||||
|
};
|
||||||
|
|
||||||
|
// Объект вершинного буфера
|
||||||
|
class BO
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BO(BUFFER_TYPE type); // Создает пустой буфер заданного типа
|
||||||
|
BO(BUFFER_TYPE type, const void *data, int size); // Создает и загружает туда данные
|
||||||
|
~BO(); // Уничтожает буфер
|
||||||
|
BO(const BO & copy); // Конструктор копирования
|
||||||
|
BO& operator=(const BO & other); // Оператор присваивания
|
||||||
|
|
||||||
|
void load(const void *data, int size, GLuint mode = GL_STATIC_DRAW); // Загрузка данных в буфер
|
||||||
|
void use();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
GLuint handler; // Дескриптор
|
||||||
|
BUFFER_TYPE type; // Тип буфера
|
||||||
|
private:
|
||||||
|
static std::map<GLuint, GLuint> handler_count; // Счетчик использований дескриптора
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BUFFERS_H
|
|
@ -0,0 +1,119 @@
|
||||||
|
#include "Buffers.h"
|
||||||
|
|
||||||
|
// Счетчики использований дескрипторов
|
||||||
|
std::map<GLuint, GLuint> VAO::handler_count;
|
||||||
|
std::map<GLuint, GLuint> BO::handler_count;
|
||||||
|
|
||||||
|
// Создает VAO и активирует его
|
||||||
|
VAO::VAO()
|
||||||
|
{
|
||||||
|
glGenVertexArrays(1, &handler); // Генерация одного объекта массива вершин
|
||||||
|
glBindVertexArray(handler); // Привязка для использования
|
||||||
|
handler_count[handler] = 1; // Инициализация счетчика для дескриптора
|
||||||
|
}
|
||||||
|
|
||||||
|
// Уничтожает VAO
|
||||||
|
VAO::~VAO()
|
||||||
|
{
|
||||||
|
// Если дескриптор никем не используется - освободим его
|
||||||
|
if (!--handler_count[handler])
|
||||||
|
{
|
||||||
|
glDeleteVertexArrays(1, &handler);
|
||||||
|
handler_count.erase(handler); // Удаление из словаря
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Конструктор копирования
|
||||||
|
VAO::VAO(const VAO & copy) : handler(copy.handler)
|
||||||
|
{
|
||||||
|
handler_count[handler]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Оператор присваивания
|
||||||
|
VAO& VAO::operator=(const VAO & other)
|
||||||
|
{
|
||||||
|
// Если это разные дескрипторы
|
||||||
|
if (handler != other.handler)
|
||||||
|
{ // то следуюет удалить текущий перед заменой
|
||||||
|
this->~VAO();
|
||||||
|
handler = other.handler;
|
||||||
|
handler_count[handler]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Активация VAO
|
||||||
|
void VAO::use()
|
||||||
|
{
|
||||||
|
glBindVertexArray(handler); // Привязка VAO для использования
|
||||||
|
}
|
||||||
|
|
||||||
|
// Деактивация активного VAO
|
||||||
|
void VAO::disable()
|
||||||
|
{
|
||||||
|
glBindVertexArray(0); // Отключение VAO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создает пустой буфер заданного типа
|
||||||
|
BO::BO(BUFFER_TYPE t) : type(t)
|
||||||
|
{
|
||||||
|
glGenBuffers(1, &handler); // Генерация одного объекта буфера
|
||||||
|
handler_count[handler] = 1;
|
||||||
|
use(); // Привязка буфера
|
||||||
|
}
|
||||||
|
|
||||||
|
// Создает и загружает туда данные
|
||||||
|
BO::BO(BUFFER_TYPE t, const void *data, int size) : BO(t)
|
||||||
|
{
|
||||||
|
load(data, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Уничтожает буфер
|
||||||
|
BO::~BO()
|
||||||
|
{
|
||||||
|
if (handler) // Если буфер был создан
|
||||||
|
{
|
||||||
|
// Если дескриптор никем не используется - освободим его
|
||||||
|
if (!--handler_count[handler])
|
||||||
|
{
|
||||||
|
glDeleteBuffers(1, &handler);
|
||||||
|
handler_count.erase(handler); // Удаление из словаря
|
||||||
|
}
|
||||||
|
handler = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Конструктор копирования
|
||||||
|
BO::BO(const BO & copy) : handler(copy.handler), type(copy.type)
|
||||||
|
{
|
||||||
|
handler_count[handler]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Оператор присваивания
|
||||||
|
BO& BO::operator=(const BO & other)
|
||||||
|
{
|
||||||
|
// Если это разные дескрипторы
|
||||||
|
if (handler != other.handler)
|
||||||
|
{ // то следуюет удалить текущий перед заменой
|
||||||
|
this->~BO();
|
||||||
|
handler = other.handler;
|
||||||
|
handler_count[handler]++;
|
||||||
|
}
|
||||||
|
// Изменим тип
|
||||||
|
type = other.type;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Загрузка вершин в буфер
|
||||||
|
void BO::load(const void *data, int size, GLuint mode)
|
||||||
|
{
|
||||||
|
use(); // Привязка буфера
|
||||||
|
glBufferData(type, size, data, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BO::use()
|
||||||
|
{
|
||||||
|
glBindBuffer(type, handler); // Привязка элементного буфера
|
||||||
|
}
|
62
src/main.cpp
62
src/main.cpp
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Buffers.h"
|
||||||
|
|
||||||
#define WINDOW_WIDTH 800
|
#define WINDOW_WIDTH 800
|
||||||
#define WINDOW_HEIGHT 600
|
#define WINDOW_HEIGHT 600
|
||||||
#define WINDOW_CAPTION "OPENGL notes on rekovalev.site"
|
#define WINDOW_CAPTION "OPENGL notes on rekovalev.site"
|
||||||
|
@ -110,6 +112,21 @@ GLuint LoadShaders(const char *vertex_file, const char *fragment_file)
|
||||||
return programID;
|
return programID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Функция для конфигурации атрибутов
|
||||||
|
void attrib_config()
|
||||||
|
{
|
||||||
|
// Определим спецификацию атрибута
|
||||||
|
glVertexAttribPointer( 0 // индекс атрибута, должен совпадать с Layout шейдера
|
||||||
|
, 3 // количество компонент одного элемента
|
||||||
|
, GL_FLOAT // тип
|
||||||
|
, GL_FALSE // необходимость нормировать значения
|
||||||
|
, 0 // шаг
|
||||||
|
, (void *)0 // отступ с начала массива
|
||||||
|
);
|
||||||
|
// Включаем необходимый атрибут у выбранного VAO
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
GLFWwindow* window; // Указатель на окно GLFW3
|
GLFWwindow* window; // Указатель на окно GLFW3
|
||||||
|
@ -163,44 +180,26 @@ int main(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
// VAO
|
// VAO
|
||||||
GLuint VertexArrayID;
|
VAO vao;
|
||||||
glGenVertexArrays(1, &VertexArrayID); // Генерация одного объекта массива вершин
|
|
||||||
glBindVertexArray(VertexArrayID); // Привязка для использования
|
|
||||||
|
|
||||||
// VBO вершинный
|
// VBO вершинный
|
||||||
GLuint vertexbuffer;
|
BO vbo_vert(VERTEX);
|
||||||
glGenBuffers(1, &vertexbuffer); // Генерация одного объекта буфера вершин
|
attrib_config(); // Конфигурация аттрибутов
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); // Привязка буфера вершин к используемому VAO
|
|
||||||
|
|
||||||
// Загрузка вершин в используемый буфер вершин
|
// Загрузка вершин в используемый буфер вершин
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);
|
vbo_vert.load(verticies, sizeof(verticies));
|
||||||
|
|
||||||
// Определим спецификацию атрибута
|
|
||||||
glVertexAttribPointer( 0 // индекс атрибута, должен совпадать с Layout шейдера
|
|
||||||
, 3 // количество компонент одного элемента
|
|
||||||
, GL_FLOAT // тип
|
|
||||||
, GL_FALSE // необходимость нормировать значения
|
|
||||||
, 0 // шаг
|
|
||||||
, (void *)0 // отступ с начала массива
|
|
||||||
);
|
|
||||||
// Включаем необходимый атрибут у выбранного VAO
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
|
|
||||||
// индексы вершин
|
// индексы вершин
|
||||||
GLuint indices[] = {0, 1, 2, 2, 3, 0};
|
GLuint indices[] = {0, 1, 2, 2, 3, 0};
|
||||||
|
|
||||||
// VBO элементный (индексы вершин)
|
// VBO элементный (индексы вершин)
|
||||||
GLuint elementbuffer;
|
BO vbo_elem(ELEMENT);
|
||||||
glGenBuffers(1, &elementbuffer); // Генерация одного объекта буфера вершин
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer); // Привязка элементного буфера
|
|
||||||
|
|
||||||
// Загрузка индексов в используемый элементныйбуфер
|
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
|
// Загрузка индексов в используемый элементный буфер
|
||||||
|
vbo_elem.load(indices, sizeof(indices));
|
||||||
|
|
||||||
// Установка цвета очистки буфера цвета
|
// Установка цвета очистки буфера цвета
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
|
||||||
// Пока не произойдет событие запроса закрытия окна
|
// Пока не произойдет событие запроса закрытия окна
|
||||||
while(!glfwWindowShouldClose(window))
|
while(!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
|
@ -208,9 +207,9 @@ int main(void)
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
// Тут производится рендер
|
// Тут производится рендер
|
||||||
glBindVertexArray(VertexArrayID); // Привязка VAO для использования
|
vao.use();
|
||||||
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLuint), GL_UNSIGNED_INT, (void*)0);
|
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLuint), GL_UNSIGNED_INT, (void*)0);
|
||||||
glBindVertexArray(0); // Отключение VAO
|
vao.disable();
|
||||||
|
|
||||||
// Представление содержимого буфера цепочки показа на окно
|
// Представление содержимого буфера цепочки показа на окно
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
|
@ -221,12 +220,5 @@ int main(void)
|
||||||
// Удаление шейдерной программы
|
// Удаление шейдерной программы
|
||||||
glDeleteProgram(shaderProgram);
|
glDeleteProgram(shaderProgram);
|
||||||
|
|
||||||
// Удаление VBO
|
|
||||||
glDeleteBuffers(1, &vertexbuffer);
|
|
||||||
glDeleteBuffers(1, &elementbuffer);
|
|
||||||
|
|
||||||
// Удаление VAO
|
|
||||||
glDeleteVertexArrays(1, &VertexArrayID);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue