Матрицы проекции и вида для точечных источников
This commit is contained in:
parent
5a727f94da
commit
ec44eebe2d
|
@ -18,6 +18,7 @@ struct LightData
|
|||
alignas(16) glm::vec3 color; // Цвет
|
||||
alignas(16) glm::vec3 attenuation; // Радиус действия источника, линейный и квадратичный коэф. угасания
|
||||
alignas(16) glm::vec4 direction_angle; // Направление и половинный угол освещенности
|
||||
alignas(16) glm::mat4 vp[6]; // Матрицы проекции и трансформации в пространство источника
|
||||
};
|
||||
|
||||
// Источник света
|
||||
|
@ -58,6 +59,7 @@ class Light : public Node
|
|||
void toData(); // Преобразует информацию об источнике в структуру LightData
|
||||
|
||||
virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed
|
||||
void recalcVP(); // Пересчитывает по необходимости матрицу вида-проекции
|
||||
|
||||
static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
|
||||
static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
|
||||
|
|
|
@ -98,7 +98,15 @@ void Light::toData()
|
|||
{
|
||||
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; // Цвет
|
||||
// Если радиус изменился
|
||||
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