Compare commits
3 Commits
Author | SHA1 | Date |
---|---|---|
Ковалев Роман Евгеньевич | 0d43682bcf | |
Ковалев Роман Евгеньевич | d69800a466 | |
Ковалев Роман Евгеньевич | 2f63a57fd7 |
|
@ -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
|
||||||
|
|
|
@ -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); // Загрузка индексов в буфер
|
||||||
|
|
|
@ -17,7 +17,7 @@ class Scene
|
||||||
Scene(const Scene ©); // Конструктор копирования
|
Scene(const Scene ©); // Конструктор копирования
|
||||||
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; // Корневой узел
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Перестройка узлов выбранного списка
|
// Перестройка узлов выбранного списка
|
||||||
|
|
30
src/main.cpp
30
src/main.cpp
|
@ -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,24 +115,17 @@ 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();
|
||||||
// Очистка буфера цвета и глубины
|
// Очистка буфера цвета и глубины
|
||||||
|
|
Loading…
Reference in New Issue