Как сделать мягкие тени с помощью каскадного картирования теней? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь реализовать мягкие тени, используя каскадное отображение теней.

Для этого теста я использую PCF:

for(int i = 0; i < 16; i++)
{
    int index = int(16.0*random(worldPos.xyz, i))%16;
    shadow += 1.0 - textureProj(projCoords + vec4(poissonDisk[index] / divisor, 0.0, 0.0), cascadeIndex);
}
shadow /= 16.0;

Проблема заключается в том, что я использую каскадное отображение теней, кажется, что размер объекта на карте теней не одинаков между разными направлениями камеры.

Вот пример (квад в правом нижнем углу рисует карту теней первого каскада):

correctWidth smallWidth

Как видно на втором изображении, ширина щуки на карте теней меньше, чем на первом изображении.

Поскольку PCFчитая передний текст карты теней, независимо от ориентации камеры, щука выглядит меньше, чем прозрачнее.

Во многих алгоритмах мягких теней, которые я читаю в Интернете, я вижу, что они состоят из чтениянекоторые фронтальные элементы карты теней.

Мой вопрос: несовместим ли этот алгоритм с каскадным отображением теней или есть способ это исправить?

1 Ответ

1 голос
/ 25 сентября 2019

Похоже, вы используете наиболее подходящий подход для вашей орфографической проекции.Если ортографическая проекция от солнца лучше всего подходит для участков вашей камеры, наблюдающих усеченный конус, то ориентация камеры изменит площадь поперечного сечения усеченного солнечного луча.

Решение состоит в том, чтобы соответствоватьортогональные усеченные контуры, охватывающие каждую секцию усеченной области вашей камеры ... это гарантирует, что область, окруженная вашей ортографической проекцией, будет одинаковой независимо от ориентации вашей камеры.

...