Compare commits
No commits in common. "master" and "v0.4" have entirely different histories.
|
@ -10,7 +10,8 @@
|
||||||
],
|
],
|
||||||
"compilerPath": "C:/MinGW/bin/g++.exe",
|
"compilerPath": "C:/MinGW/bin/g++.exe",
|
||||||
"cStandard": "c11",
|
"cStandard": "c11",
|
||||||
"cppStandard": "c++11"
|
"cppStandard": "c++11",
|
||||||
|
"intelliSenseMode": "gcc-x86"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version": 4
|
"version": 4
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
#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
|
|
119
src/Buffers.cpp
119
src/Buffers.cpp
|
@ -1,119 +0,0 @@
|
||||||
#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); // Привязка элементного буфера
|
|
||||||
}
|
|
64
src/main.cpp
64
src/main.cpp
|
@ -5,8 +5,6 @@
|
||||||
|
|
||||||
#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"
|
||||||
|
@ -112,21 +110,6 @@ 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
|
||||||
|
@ -180,26 +163,44 @@ int main(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
// VAO
|
// VAO
|
||||||
VAO vao;
|
GLuint VertexArrayID;
|
||||||
|
glGenVertexArrays(1, &VertexArrayID); // Генерация одного объекта массива вершин
|
||||||
|
glBindVertexArray(VertexArrayID); // Привязка для использования
|
||||||
|
|
||||||
// VBO вершинный
|
// VBO вершинный
|
||||||
BO vbo_vert(VERTEX);
|
GLuint vertexbuffer;
|
||||||
attrib_config(); // Конфигурация аттрибутов
|
glGenBuffers(1, &vertexbuffer); // Генерация одного объекта буфера вершин
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); // Привязка буфера вершин к используемому VAO
|
||||||
|
|
||||||
// Загрузка вершин в используемый буфер вершин
|
// Загрузка вершин в используемый буфер вершин
|
||||||
vbo_vert.load(verticies, sizeof(verticies));
|
glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// Определим спецификацию атрибута
|
||||||
|
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 элементный (индексы вершин)
|
||||||
BO vbo_elem(ELEMENT);
|
GLuint elementbuffer;
|
||||||
|
glGenBuffers(1, &elementbuffer); // Генерация одного объекта буфера вершин
|
||||||
// Загрузка индексов в используемый элементный буфер
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementbuffer); // Привязка элементного буфера
|
||||||
vbo_elem.load(indices, sizeof(indices));
|
|
||||||
|
|
||||||
|
// Загрузка индексов в используемый элементныйбуфер
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
|
||||||
// Установка цвета очистки буфера цвета
|
// Установка цвета очистки буфера цвета
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
|
||||||
// Пока не произойдет событие запроса закрытия окна
|
// Пока не произойдет событие запроса закрытия окна
|
||||||
while(!glfwWindowShouldClose(window))
|
while(!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
|
@ -207,9 +208,9 @@ int main(void)
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
// Тут производится рендер
|
// Тут производится рендер
|
||||||
vao.use();
|
glBindVertexArray(VertexArrayID); // Привязка VAO для использования
|
||||||
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLuint), GL_UNSIGNED_INT, (void*)0);
|
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLuint), GL_UNSIGNED_INT, (void*)0);
|
||||||
vao.disable();
|
glBindVertexArray(0); // Отключение VAO
|
||||||
|
|
||||||
// Представление содержимого буфера цепочки показа на окно
|
// Представление содержимого буфера цепочки показа на окно
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
|
@ -219,6 +220,13 @@ 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