Класс буфера кадра
This commit is contained in:
parent
01b85b7c6e
commit
2f63a57fd7
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
20
src/main.cpp
20
src/main.cpp
|
@ -118,24 +118,20 @@ 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();
|
||||
// Очистка буфера цвета и глубины
|
||||
|
|
Loading…
Reference in New Issue