Compare commits

..

5 Commits
v0.1 ... master

8 changed files with 105 additions and 55 deletions

View File

@ -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; // Дескриптор

View File

@ -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

View File

@ -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(); // Возвращает тип текстуры

View File

@ -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++)

View File

@ -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()
{ {

View File

@ -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;
}

View File

@ -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()
{ {

View File

@ -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();