Compare commits
5 Commits
Author | SHA1 | Date |
---|---|---|
Ковалев Роман Евгеньевич | df35cd6850 | |
Ковалев Роман Евгеньевич | 1cf48d9835 | |
Ковалев Роман Евгеньевич | f97f2f8690 | |
Ковалев Роман Евгеньевич | 3c3996e985 | |
Ковалев Роман Евгеньевич | 1fd082289d |
|
@ -80,8 +80,6 @@ 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; // Дескриптор
|
||||||
|
|
|
@ -63,4 +63,27 @@ class Light : public Node
|
||||||
static Light lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
static Light lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Класс направленного источника освещения
|
||||||
|
class Sun
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static Sun& get(); // Доступ к синглтону
|
||||||
|
static void upload(UBO& sun_data); // Загрузка данных об источнике в буфер
|
||||||
|
|
||||||
|
const glm::vec3& c_direction() const; // Константный доступ к направлению лучей источника
|
||||||
|
glm::vec3& e_direction(); // Неконстантная ссылка для изменений направления лучей источника
|
||||||
|
|
||||||
|
const glm::vec3& c_color() const; // Константный доступ к цвету
|
||||||
|
glm::vec3& e_color(); // Неконстантная ссылка для изменений цвета
|
||||||
|
|
||||||
|
private:
|
||||||
|
Sun(const glm::vec3 &direction = glm::vec3(0.0f, 1.0f, 0.0f), const glm::vec3 &color = glm::vec3(0.4f, 0.4f, 0.4f));
|
||||||
|
|
||||||
|
alignas(16) glm::vec3 direction; // Направление лучей источника
|
||||||
|
alignas(16) glm::vec3 color; // Цвет
|
||||||
|
|
||||||
|
static Sun instance; // Экземпляр синглтона
|
||||||
|
static bool uploadReq; // Необходимость загрузки в следствии изменений
|
||||||
|
};
|
||||||
|
|
||||||
#endif // LIGHTS_H
|
#endif // LIGHTS_H
|
||||||
|
|
|
@ -23,8 +23,6 @@ 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(); // Возвращает тип текстуры
|
||||||
|
|
|
@ -23,6 +23,12 @@ layout(std140, binding = 2) uniform Light
|
||||||
int count;
|
int count;
|
||||||
} light_f;
|
} light_f;
|
||||||
|
|
||||||
|
layout(std140, binding = 3) uniform Sun
|
||||||
|
{
|
||||||
|
vec3 direction;
|
||||||
|
vec3 color;
|
||||||
|
} sun;
|
||||||
|
|
||||||
uniform sampler2D gPosition;
|
uniform sampler2D gPosition;
|
||||||
uniform sampler2D gNormal;
|
uniform sampler2D gNormal;
|
||||||
uniform sampler2D gDiffuseP;
|
uniform sampler2D gDiffuseP;
|
||||||
|
@ -54,6 +60,23 @@ void main()
|
||||||
// Фоновая освещенность
|
// Фоновая освещенность
|
||||||
color = vec4(ka, 1);
|
color = vec4(ka, 1);
|
||||||
|
|
||||||
|
// Расчет солнца, если его цвет не черный
|
||||||
|
if (length(sun.color) > 0)
|
||||||
|
{
|
||||||
|
// Данные об источнике относительно фрагмента
|
||||||
|
L_vertex = normalize(sun.direction);
|
||||||
|
// Диффузная составляющая
|
||||||
|
diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0
|
||||||
|
|
||||||
|
// Вектор половины пути
|
||||||
|
H = normalize(L_vertex + Cam_vertex);
|
||||||
|
// Зеркальная составляющая
|
||||||
|
specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p
|
||||||
|
// Результирующий цвет с учетом солнца
|
||||||
|
color += vec4(sun.color*kd*diffuse, 1)
|
||||||
|
+ vec4(sun.color*ks*specular, 1);
|
||||||
|
}
|
||||||
|
|
||||||
// Цикл по источникам света
|
// Цикл по источникам света
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < light_f.count; i++)
|
for (i = 0; i < light_f.count; i++)
|
||||||
|
|
|
@ -189,13 +189,6 @@ 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()
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,9 @@ GLuint Light::count = 0; // количество используемых ист
|
||||||
LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света
|
LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света
|
||||||
Light Light::lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
Light Light::lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
||||||
|
|
||||||
|
Sun Sun::instance; // Экземпляр синглтона
|
||||||
|
bool Sun::uploadReq = true; // Необходимость загрузки в следствии изменений
|
||||||
|
|
||||||
// возвращает размер буфера в байтах
|
// возвращает размер буфера в байтах
|
||||||
int Light::getUBOsize()
|
int Light::getUBOsize()
|
||||||
{
|
{
|
||||||
|
@ -245,3 +248,54 @@ float& Light::e_angle()
|
||||||
|
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Конструктор направленного источника с параметрами направления и цвета
|
||||||
|
Sun::Sun(const glm::vec3 &dir, const glm::vec3 &c) : direction(dir), color(c)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Доступ к синглтону
|
||||||
|
Sun& Sun::get()
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Загрузка данных об источнике на шейдер
|
||||||
|
void Sun::upload(UBO& sun_data)
|
||||||
|
{
|
||||||
|
if (uploadReq)
|
||||||
|
{
|
||||||
|
sun_data.loadSub(&instance, sizeof(instance));
|
||||||
|
|
||||||
|
uploadReq = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Константный доступ к направлению лучей источника
|
||||||
|
const glm::vec3& Sun::c_direction() const
|
||||||
|
{
|
||||||
|
return instance.direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Неконстантная ссылка для изменений направления лучей источника
|
||||||
|
glm::vec3& Sun::e_direction()
|
||||||
|
{
|
||||||
|
uploadReq = true;
|
||||||
|
|
||||||
|
return instance.direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Константный доступ к цвету
|
||||||
|
const glm::vec3& Sun::c_color() const
|
||||||
|
{
|
||||||
|
return instance.color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Неконстантная ссылка для изменений цвета
|
||||||
|
glm::vec3& Sun::e_color()
|
||||||
|
{
|
||||||
|
uploadReq = true;
|
||||||
|
|
||||||
|
return instance.color;
|
||||||
|
}
|
||||||
|
|
|
@ -115,13 +115,6 @@ 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,42 +9,14 @@
|
||||||
#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;
|
||||||
|
@ -145,6 +117,7 @@ int main(void)
|
||||||
UBO cameraUB(sizeof(CameraData), 0);
|
UBO cameraUB(sizeof(CameraData), 0);
|
||||||
UBO material_data(sizeof(Material), 1);
|
UBO material_data(sizeof(Material), 1);
|
||||||
UBO light_data(Light::getUBOsize(), 2);
|
UBO light_data(Light::getUBOsize(), 2);
|
||||||
|
UBO sun_data(sizeof(Sun), 3);
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
@ -162,13 +135,6 @@ int main(void)
|
||||||
// Активируем базовый буфер кадра
|
// Активируем базовый буфер кадра
|
||||||
FBO::useDefault();
|
FBO::useDefault();
|
||||||
|
|
||||||
// Сохраним указатели на текстуры для изменения размеров окна
|
|
||||||
pgPosition = &gPosition;
|
|
||||||
pgNormal = &gNormal;
|
|
||||||
pgDiffuseP = &gDiffuseP;
|
|
||||||
pgAmbientSpecular = &gAmbientSpecular;
|
|
||||||
pgrbo = &grbo;
|
|
||||||
|
|
||||||
// Шейдер для расчета освещенности
|
// Шейдер для расчета освещенности
|
||||||
ShaderProgram lightShader;
|
ShaderProgram lightShader;
|
||||||
// Загрузка и компиляция шейдеров
|
// Загрузка и компиляция шейдеров
|
||||||
|
@ -204,6 +170,8 @@ int main(void)
|
||||||
cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData));
|
cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData));
|
||||||
// Загрузим информацию об источниках света
|
// Загрузим информацию об источниках света
|
||||||
Light::upload(light_data);
|
Light::upload(light_data);
|
||||||
|
// Загружаем информацию о направленном источнике
|
||||||
|
Sun::upload(sun_data);
|
||||||
|
|
||||||
// Активируем G-кадра
|
// Активируем G-кадра
|
||||||
gbuffer.use();
|
gbuffer.use();
|
||||||
|
|
Loading…
Reference in New Issue