Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Ковалев Роман Евгеньевич | 7c0421c0ea | |
Ковалев Роман Евгеньевич | 6cdd1ef845 |
|
@ -80,6 +80,8 @@ class RBO
|
||||||
RBO(int w, int h, GLuint component = GL_DEPTH_COMPONENT); // Создает буфер рендера с заданными параметрами размеров и используемых компонент
|
RBO(int w, int h, GLuint component = GL_DEPTH_COMPONENT); // Создает буфер рендера с заданными параметрами размеров и используемых компонент
|
||||||
~RBO(); // Уничтожение буфера
|
~RBO(); // Уничтожение буфера
|
||||||
|
|
||||||
|
void reallocate(int w, int h, GLuint component = GL_DEPTH_COMPONENT); // Изменяет размеры буфера рендера
|
||||||
|
|
||||||
GLuint getHandler(); // Возвращает дескриптор буфера рендера
|
GLuint getHandler(); // Возвращает дескриптор буфера рендера
|
||||||
protected:
|
protected:
|
||||||
GLuint handler; // Дескриптор
|
GLuint handler; // Дескриптор
|
||||||
|
|
|
@ -23,6 +23,8 @@ class Texture
|
||||||
|
|
||||||
Texture& operator=(const Texture& other); // Оператор присваивания
|
Texture& operator=(const Texture& other); // Оператор присваивания
|
||||||
|
|
||||||
|
void reallocate(GLuint width, GLuint height, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Пересоздает текстуру для имеющегося дескриптора
|
||||||
|
|
||||||
void use(); // Привязка текстуры
|
void use(); // Привязка текстуры
|
||||||
static void disable(GLuint type); // Отвязка текстуры по типу
|
static void disable(GLuint type); // Отвязка текстуры по типу
|
||||||
GLuint getType(); // Возвращает тип текстуры
|
GLuint getType(); // Возвращает тип текстуры
|
||||||
|
|
|
@ -189,6 +189,13 @@ RBO::~RBO()
|
||||||
glDeleteRenderbuffers(1, &handler);
|
glDeleteRenderbuffers(1, &handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Изменяет размеры буфера рендера
|
||||||
|
void RBO::reallocate(int w, int h, GLuint component)
|
||||||
|
{
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, handler); // Привязка элементного буфера
|
||||||
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
// Возвращает дескриптор буфера рендера
|
// Возвращает дескриптор буфера рендера
|
||||||
GLuint RBO::getHandler()
|
GLuint RBO::getHandler()
|
||||||
{
|
{
|
||||||
|
|
|
@ -115,6 +115,13 @@ Texture::~Texture()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Пересоздает текстуру для имеющегося дескриптора
|
||||||
|
void Texture::reallocate(GLuint width, GLuint height, GLuint texType, GLint internalformat, GLint format, GLenum dataType)
|
||||||
|
{
|
||||||
|
use();
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, dataType, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
// Привязка текстуры
|
// Привязка текстуры
|
||||||
void Texture::use()
|
void Texture::use()
|
||||||
{
|
{
|
||||||
|
|
42
src/main.cpp
42
src/main.cpp
|
@ -9,14 +9,42 @@
|
||||||
#include "Shader.h"
|
#include "Shader.h"
|
||||||
#include "Lights.h"
|
#include "Lights.h"
|
||||||
|
|
||||||
#define WINDOW_WIDTH 800
|
|
||||||
#define WINDOW_HEIGHT 600
|
|
||||||
#define WINDOW_CAPTION "OPENGL notes on rekovalev.site"
|
#define WINDOW_CAPTION "OPENGL notes on rekovalev.site"
|
||||||
|
|
||||||
|
// Указатели на текстуры для изменения размеров окна
|
||||||
|
Texture* pgPosition = NULL;
|
||||||
|
Texture* pgNormal = NULL;
|
||||||
|
Texture* pgDiffuseP = NULL;
|
||||||
|
Texture* pgAmbientSpecular = NULL;
|
||||||
|
RBO* pgrbo = NULL;
|
||||||
|
// Размеры окна
|
||||||
|
int WINDOW_WIDTH = 800;
|
||||||
|
int WINDOW_HEIGHT = 600;
|
||||||
|
|
||||||
// Функция-callback для изменения размеров буфера кадра в случае изменения размеров поверхности окна
|
// Функция-callback для изменения размеров буфера кадра в случае изменения размеров поверхности окна
|
||||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
// Изменение размеров текстур для G-буфера
|
||||||
|
if (pgPosition)
|
||||||
|
pgPosition->reallocate(width, height, 0, GL_RGB32F, GL_RGB);
|
||||||
|
if (pgNormal)
|
||||||
|
pgNormal->reallocate(width, height, 1, GL_RGB16F, GL_RGB);
|
||||||
|
if (pgDiffuseP)
|
||||||
|
pgDiffuseP->reallocate(width, height, 2, GL_RGBA16F);
|
||||||
|
if (pgAmbientSpecular)
|
||||||
|
pgAmbientSpecular->reallocate(width, height, 3);
|
||||||
|
// И буфера глубины
|
||||||
|
if (pgrbo)
|
||||||
|
pgrbo->reallocate(width, height);
|
||||||
|
|
||||||
|
// Запомним новые размеры окна
|
||||||
|
WINDOW_WIDTH = width;
|
||||||
|
WINDOW_HEIGHT = height;
|
||||||
|
|
||||||
|
// Изменим параметры перспективной матрицы проекции для камеры
|
||||||
|
Camera::current().setPerspective(CAMERA_FOVy, (float)width/height);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool firstMouse = true;
|
bool firstMouse = true;
|
||||||
|
@ -94,7 +122,6 @@ int main(void)
|
||||||
const char* textures_base_shader_names[] = {"tex_diffuse", "tex_ambient", "tex_specular"};
|
const char* textures_base_shader_names[] = {"tex_diffuse", "tex_ambient", "tex_specular"};
|
||||||
gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*));
|
gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*));
|
||||||
|
|
||||||
|
|
||||||
// Загрузка сцены из obj файла
|
// Загрузка сцены из obj файла
|
||||||
Scene scene = loadOBJtoScene("../resources/models/blob.obj", "../resources/models/", "../resources/textures/");
|
Scene scene = loadOBJtoScene("../resources/models/blob.obj", "../resources/models/", "../resources/textures/");
|
||||||
scene.root.e_scale() = glm::vec3(0.01);
|
scene.root.e_scale() = glm::vec3(0.01);
|
||||||
|
@ -124,7 +151,7 @@ int main(void)
|
||||||
GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
|
GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
|
||||||
FBO gbuffer(attachments, sizeof(attachments) / sizeof(GLuint));
|
FBO gbuffer(attachments, sizeof(attachments) / sizeof(GLuint));
|
||||||
// Создадим текстуры для буфера кадра
|
// Создадим текстуры для буфера кадра
|
||||||
Texture gPosition(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 0, GL_RGB16F, GL_RGB); // Позиция вершины
|
Texture gPosition(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 0, GL_RGB32F, GL_RGB); // Позиция вершины
|
||||||
Texture gNormal(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT1, 1, GL_RGB16F, GL_RGB); // Нормали
|
Texture gNormal(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT1, 1, GL_RGB16F, GL_RGB); // Нормали
|
||||||
Texture gDiffuseP(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT2, 2, GL_RGBA16F); // Диффузная составляющая и коэф. глянцевости
|
Texture gDiffuseP(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT2, 2, GL_RGBA16F); // Диффузная составляющая и коэф. глянцевости
|
||||||
Texture gAmbientSpecular(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT3, 3); // Фоновая составляющая и один канал зеркальной
|
Texture gAmbientSpecular(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT3, 3); // Фоновая составляющая и один канал зеркальной
|
||||||
|
@ -134,6 +161,13 @@ int main(void)
|
||||||
// Активируем базовый буфер кадра
|
// Активируем базовый буфер кадра
|
||||||
FBO::useDefault();
|
FBO::useDefault();
|
||||||
|
|
||||||
|
// Сохраним указатели на текстуры для изменения размеров окна
|
||||||
|
pgPosition = &gPosition;
|
||||||
|
pgNormal = &gNormal;
|
||||||
|
pgDiffuseP = &gDiffuseP;
|
||||||
|
pgAmbientSpecular = &gAmbientSpecular;
|
||||||
|
pgrbo = &grbo;
|
||||||
|
|
||||||
// Шейдер для расчета освещенности
|
// Шейдер для расчета освещенности
|
||||||
ShaderProgram lightShader;
|
ShaderProgram lightShader;
|
||||||
// Загрузка и компиляция шейдеров
|
// Загрузка и компиляция шейдеров
|
||||||
|
|
Loading…
Reference in New Issue