Параллельный источник
This commit is contained in:
parent
7793d7c05c
commit
ac1d6be8c4
|
@ -63,4 +63,27 @@ class Light : public Node
|
|||
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
|
||||
|
|
|
@ -23,6 +23,12 @@ layout(std140, binding = 2) uniform Light
|
|||
int count;
|
||||
} light_f;
|
||||
|
||||
layout(std140, binding = 3) uniform Sun
|
||||
{
|
||||
vec3 direction;
|
||||
vec3 color;
|
||||
} sun;
|
||||
|
||||
uniform sampler2D gPosition;
|
||||
uniform sampler2D gNormal;
|
||||
uniform sampler2D gDiffuseP;
|
||||
|
@ -54,6 +60,23 @@ void main()
|
|||
// Фоновая освещенность
|
||||
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;
|
||||
for (i = 0; i < light_f.count; i++)
|
||||
|
|
|
@ -8,6 +8,9 @@ GLuint Light::count = 0; // количество используемых ист
|
|||
LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света
|
||||
Light Light::lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
||||
|
||||
Sun Sun::instance; // Экземпляр синглтона
|
||||
bool Sun::uploadReq = true; // Необходимость загрузки в следствии изменений
|
||||
|
||||
// возвращает размер буфера в байтах
|
||||
int Light::getUBOsize()
|
||||
{
|
||||
|
@ -245,3 +248,54 @@ float& Light::e_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;
|
||||
}
|
||||
|
|
|
@ -145,6 +145,7 @@ int main(void)
|
|||
UBO cameraUB(sizeof(CameraData), 0);
|
||||
UBO material_data(sizeof(Material), 1);
|
||||
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
|
||||
|
||||
|
@ -204,6 +205,8 @@ int main(void)
|
|||
cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData));
|
||||
// Загрузим информацию об источниках света
|
||||
Light::upload(light_data);
|
||||
// Загружаем информацию о направленном источнике
|
||||
Sun::upload(sun_data);
|
||||
|
||||
// Активируем G-кадра
|
||||
gbuffer.use();
|
||||
|
|
Loading…
Reference in New Issue