Compare commits

..

No commits in common. "master" and "v0.4" have entirely different histories.
master ... v0.4

4 changed files with 38 additions and 198 deletions

View File

@ -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

View File

@ -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

View File

@ -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); // Привязка элементного буфера
}

View File

@ -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); // Привязка элементного буфера
// Загрузка индексов в используемый элементныйбуфер
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))
{ {
@ -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);
@ -220,5 +221,12 @@ int main(void)
// Удаление шейдерной программы // Удаление шейдерной программы
glDeleteProgram(shaderProgram); glDeleteProgram(shaderProgram);
// Удаление VBO
glDeleteBuffers(1, &vertexbuffer);
glDeleteBuffers(1, &elementbuffer);
// Удаление VAO
glDeleteVertexArrays(1, &VertexArrayID);
return 0; return 0;
} }