Compare commits

..

3 Commits
v0.1 ... master

7 changed files with 97 additions and 28 deletions

View File

@ -59,4 +59,30 @@ class UBO : public BO
void loadSub(const void *data, int size, int offset = 0); // Загрузка с отступом void loadSub(const void *data, int size, int offset = 0); // Загрузка с отступом
}; };
// Объект буфера кадра
class FBO
{
public:
FBO(GLuint *attachments, int count); // Создает буфер кадра с нужным числом прикреплений текстур
~FBO(); // Уничтожение буфера
void use(GLuint mode = GL_FRAMEBUFFER); // Активирует буфер кадра в заданном режиме
static void useDefault(GLuint mode = GL_FRAMEBUFFER); // Активирует базовый буфер в заданном режиме
void assignRenderBuffer(GLuint hander, GLuint attachment = GL_DEPTH_ATTACHMENT); // Привязка рендер буфера
protected:
GLuint handler; // Дескриптор
};
// Объект буфера рендера
class RBO
{
public:
RBO(int w, int h, GLuint component = GL_DEPTH_COMPONENT); // Создает буфер рендера с заданными параметрами размеров и используемых компонент
~RBO(); // Уничтожение буфера
GLuint getHandler(); // Возвращает дескриптор буфера рендера
protected:
GLuint handler; // Дескриптор
};
#endif // BUFFERS_H #endif // BUFFERS_H

View File

@ -3,6 +3,7 @@
#include "Buffers.h" #include "Buffers.h"
#include "Texture.h" #include "Texture.h"
#include "Shader.h"
#include <GLM/glm.hpp> #include <GLM/glm.hpp>
#include <GLM/gtc/quaternion.hpp> #include <GLM/gtc/quaternion.hpp>
@ -72,7 +73,7 @@ class Model : public Node
virtual ~Model(); virtual ~Model();
void render(); // Вызов отрисовки без uniform-данных void render(); // Вызов отрисовки без uniform-данных
void render(const GLuint &model_uniform, UBO &material_buffer); // Вызов отрисовки void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Вызов отрисовки
void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер
void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер

View File

@ -17,7 +17,7 @@ class Scene
Scene(const Scene &copy); // Конструктор копирования Scene(const Scene &copy); // Конструктор копирования
Scene& operator=(const Scene& other); // Оператор присваивания Scene& operator=(const Scene& other); // Оператор присваивания
void render(const GLuint &model_uniform, UBO &material_buffer); // Рендер сцены void render(ShaderProgram &shaderProgram, UBO &material_buffer); // Рендер сцены
Node root; // Корневой узел Node root; // Корневой узел

View File

@ -142,3 +142,55 @@ void UBO::loadSub(const void *data, int size, int offset)
use(); use();
glBufferSubData(type, offset, size, data); 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;
}

View File

@ -263,10 +263,10 @@ void Model::render()
} }
// Вызов отрисовки // Вызов отрисовки
void Model::render(const GLuint &model_uniform, UBO &material_buffer) void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer)
{ {
// Загрузим матрицу трансформации // Расчитаем матрицу трансформации
glUniformMatrix4fv(model_uniform, 1, GL_FALSE, &getTransformMatrix()[0][0]); glUniformMatrix4fv(shaderProgram.getUniformLoc("model"), 1, GL_FALSE, &this->getTransformMatrix()[0][0]);
// Подключаем текстуры // Подключаем текстуры
texture_diffuse.use(); texture_diffuse.use();

View File

@ -27,10 +27,10 @@ Scene& Scene::operator=(const Scene& other)
} }
// Рендер сцены // Рендер сцены
void Scene::render(const GLuint &model_uniform, UBO &material_buffer) void Scene::render(ShaderProgram &shaderProgram, UBO &material_buffer)
{ {
for (auto & model : models) for (auto & model : models)
model.render(model_uniform, material_buffer); model.render(shaderProgram, material_buffer);
} }
// Перестройка узлов выбранного списка // Перестройка узлов выбранного списка

View File

@ -103,9 +103,6 @@ int main(void)
// Установка цвета очистки буфера цвета // Установка цвета очистки буфера цвета
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Расположение Uniform-переменной
GLuint model_uniform = base.getUniformLoc("model");
// Источник света // Источник света
LightData light = { {1.0f, 3.0f, 0.0f} // позиция LightData light = { {1.0f, 3.0f, 0.0f} // позиция
, {1.0f, 1.0f, 1.0f} // цвет , {1.0f, 1.0f, 1.0f} // цвет
@ -118,25 +115,18 @@ int main(void)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap
// Создадим буфер кадра и сделаем его активным // Создадим буфер кадра с данными о используемых привязках
GLuint fbo; GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glGenFramebuffers(1, &fbo); FBO fbo(attachments, sizeof(attachments) / sizeof(GLuint));
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
// Создадим текстуры для буфера кадра // Создадим текстуры для буфера кадра
Texture colors(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0); Texture colors(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0);
Texture normals(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT1, 0, GL_RGBA16F); Texture normals(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT1, 0, GL_RGBA16F);
// Укажем буферу используемые точки привязки текстур
GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(sizeof(attachments) / sizeof(GLuint), attachments);
// Создадим буфер рендера под буфер глубины и привяжем его // Создадим буфер рендера под буфер глубины и привяжем его
unsigned int rbo; RBO rbo(WINDOW_WIDTH, WINDOW_HEIGHT);
glGenRenderbuffers(1, &rbo); fbo.assignRenderBuffer(rbo.getHandler());
glBindRenderbuffer(GL_RENDERBUFFER, rbo); // Активируем базовый буфер кадра
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, WINDOW_WIDTH, WINDOW_HEIGHT); FBO::useDefault();
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);
// Базовый буфер кадра
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Шейдер для переноса текстуры на прямоугольник // Шейдер для переноса текстуры на прямоугольник
ShaderProgram quadProgram; ShaderProgram quadProgram;
// Загрузка и компиляция шейдеров // Загрузка и компиляция шейдеров
@ -163,17 +153,17 @@ int main(void)
cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData)); cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData));
// Активируем буфер кадра // Активируем буфер кадра
glBindFramebuffer(GL_FRAMEBUFFER, fbo); fbo.use();
// Используем шейдер с освещением // Используем шейдер с освещением
base.use(); base.use();
// Очистка буфера цвета и глубины // Очистка буфера цвета и глубины
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Тут производится рендер // Тут производится рендер
scene.render(model_uniform, material_data); scene.render(base, material_data);
// Активируем базовый буфер кадра // Активируем базовый буфер кадра
glBindFramebuffer(GL_FRAMEBUFFER, 0); FBO::useDefault();
// Подключаем шейдер для прямоугольника // Подключаем шейдер для прямоугольника
quadProgram.use(); quadProgram.use();
// Очистка буфера цвета и глубины // Очистка буфера цвета и глубины