diff --git a/include/Buffers.h b/include/Buffers.h index 903246c..32a431e 100644 --- a/include/Buffers.h +++ b/include/Buffers.h @@ -59,4 +59,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 2e9eebb..9c4d928 100644 --- a/src/Buffers.cpp +++ b/src/Buffers.cpp @@ -142,3 +142,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 0708dd3..e236317 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -118,25 +118,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) cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData)); // Активируем буфер кадра - glBindFramebuffer(GL_FRAMEBUFFER, fbo); + fbo.use(); // Используем шейдер с освещением base.use(); // Очистка буфера цвета и глубины @@ -173,7 +169,7 @@ int main(void) scene.render(model_uniform, material_data); // Активируем базовый буфер кадра - glBindFramebuffer(GL_FRAMEBUFFER, 0); + FBO::useDefault(); // Подключаем шейдер для прямоугольника quadProgram.use(); // Очистка буфера цвета и глубины