diff --git a/include/Buffers.h b/include/Buffers.h index c230d4e..a5f45b3 100644 --- a/include/Buffers.h +++ b/include/Buffers.h @@ -54,4 +54,18 @@ class UBO : public BO 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; // Дескриптор +}; + #endif // BUFFERS_H diff --git a/src/Buffers.cpp b/src/Buffers.cpp index 7d27343..ebccdf6 100644 --- a/src/Buffers.cpp +++ b/src/Buffers.cpp @@ -89,3 +89,35 @@ void UBO::loadSub(const void *data, int size, int offset) use(); 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); +} diff --git a/src/main.cpp b/src/main.cpp index 23a7622..c0ed1eb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -121,25 +121,21 @@ int main(void) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap - // Создадим буфер кадра и сделаем его активным - GLuint fbo; - glGenFramebuffers(1, &fbo); - glBindFramebuffer(GL_FRAMEBUFFER, fbo); + // Создадим буфер кадра с данными о используемых привязках + GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; + FBO fbo(attachments, sizeof(attachments) / sizeof(GLuint)); // Создадим текстуры для буфера кадра Texture colors(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0); 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; glGenRenderbuffers(1, &rbo); glBindRenderbuffer(GL_RENDERBUFFER, rbo); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, WINDOW_WIDTH, WINDOW_HEIGHT); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo); - // Базовый буфер кадра - glBindFramebuffer(GL_FRAMEBUFFER, 0); - + fbo.assignRenderBuffer(rbo); + // Активируем базовый буфер кадра + FBO::useDefault(); + // Шейдер для переноса текстуры на прямоугольник ShaderProgram quadProgram; // Загрузка и компиляция шейдеров @@ -163,7 +159,7 @@ int main(void) while(!glfwWindowShouldClose(window)) { // Активируем буфер кадра - glBindFramebuffer(GL_FRAMEBUFFER, fbo); + fbo.use(); // Используем шейдер с освещением base.use(); // Очистка буфера цвета и глубины @@ -176,7 +172,7 @@ int main(void) scene.render(model_uniform, material_data); // Активируем базовый буфер кадра - glBindFramebuffer(GL_FRAMEBUFFER, 0); + FBO::useDefault(); // Подключаем шейдер для прямоугольника quadProgram.use(); // Очистка буфера цвета и глубины