Прогнозируемая сетка водного горизонта

13

Я пытаюсь реализовать сцену океана с C ++ и DirectX11. В настоящее время у меня есть спроецированная сетка, волны Герстнера и базовая штриховка. Моя проблема в том, что когда я нацеливаю свою камеру горизонтально, чтобы я мог видеть горизонт воды, на расстоянии, проецируемая сетка становится недостаточной, даже при большом числе вершин. Эти скриншоты иллюстрируют проблему:

затененная поверхность воды

каркасная поверхность воды

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

Есть идеи?

Габор Салоки
источник

Ответы:

7

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

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

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

Бенедикт Биттерли
источник
Спасибо за совет, я выбрал пока ленивое решение. Я использую функцию в вершинном шейдере, которая определяет затухание волны на расстоянии от камеры.
Габор Салоки
6

Вы можете быть реалистичным и в режиме реального времени. секрет заключается в том, чтобы изменять представление каждый раз, когда информация попадает в шкалу Шеннона-Найквиста (то есть в виде сетки): от геометрии до карт нормалей и моделей затенения. Этот документ сделан для вас: http://maverick.inria.fr/Publications/2010/BNH10/index.php (см. Также видео Yoube)

Fabrice NEYRET
источник
3

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

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

joojaa
источник