Матрицы проекции и вида для точечных источников
This commit is contained in:
parent
5a727f94da
commit
ec44eebe2d
|
@ -18,6 +18,7 @@ struct LightData
|
||||||
alignas(16) glm::vec3 color; // Цвет
|
alignas(16) glm::vec3 color; // Цвет
|
||||||
alignas(16) glm::vec3 attenuation; // Радиус действия источника, линейный и квадратичный коэф. угасания
|
alignas(16) glm::vec3 attenuation; // Радиус действия источника, линейный и квадратичный коэф. угасания
|
||||||
alignas(16) glm::vec4 direction_angle; // Направление и половинный угол освещенности
|
alignas(16) glm::vec4 direction_angle; // Направление и половинный угол освещенности
|
||||||
|
alignas(16) glm::mat4 vp[6]; // Матрицы проекции и трансформации в пространство источника
|
||||||
};
|
};
|
||||||
|
|
||||||
// Источник света
|
// Источник света
|
||||||
|
@ -58,6 +59,7 @@ class Light : public Node
|
||||||
void toData(); // Преобразует информацию об источнике в структуру LightData
|
void toData(); // Преобразует информацию об источнике в структуру LightData
|
||||||
|
|
||||||
virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed
|
virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed
|
||||||
|
void recalcVP(); // Пересчитывает по необходимости матрицу вида-проекции
|
||||||
|
|
||||||
static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
|
static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
|
||||||
static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
|
static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
|
||||||
|
|
|
@ -98,7 +98,15 @@ void Light::toData()
|
||||||
{
|
{
|
||||||
check_id(); // Проверка на работу с корректным индексом
|
check_id(); // Проверка на работу с корректным индексом
|
||||||
|
|
||||||
data[index].position = glm::vec3(result_transform[3]); // Позиция из матрицы трансформации
|
// Если позиция изменилась
|
||||||
|
if (data[index].position.x != result_transform[3].x
|
||||||
|
|| data[index].position.y != result_transform[3].y
|
||||||
|
|| data[index].position.z != result_transform[3].z
|
||||||
|
)
|
||||||
|
{
|
||||||
|
data[index].position = glm::vec3(result_transform[3]); // Позиция из матрицы трансформации
|
||||||
|
recalcVP(); // Пересчет матрицы вида-проекции для расчета теней
|
||||||
|
}
|
||||||
data[index].color = color; // Цвет
|
data[index].color = color; // Цвет
|
||||||
// Если радиус изменился
|
// Если радиус изменился
|
||||||
if (data[index].attenuation.r != radius)
|
if (data[index].attenuation.r != radius)
|
||||||
|
@ -346,3 +354,16 @@ void Sun::recalcVP()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Пересчитывает по необходимости матрицу вида-проекции
|
||||||
|
void Light::recalcVP()
|
||||||
|
{
|
||||||
|
float near_plane = 0.1f;
|
||||||
|
glm::mat4 shadowProj = glm::perspective(glm::radians(90.0f), 1.0f, near_plane, radius);
|
||||||
|
data[index].vp[0] = shadowProj * glm::lookAt(position, position + glm::vec3( 1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f));
|
||||||
|
data[index].vp[1] = shadowProj * glm::lookAt(position, position + glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f));
|
||||||
|
data[index].vp[2] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f));
|
||||||
|
data[index].vp[3] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f));
|
||||||
|
data[index].vp[4] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f));
|
||||||
|
data[index].vp[5] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f));
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue