Трагедия планарных отражений на DTF
Набросы воды из халф лайфа уже перестают быть смешными. А контраргументы в комментариях делают всё ещё хуже. Так что давайте разбираться уже, что к чему, и где собака, так сказать, это самое.
Планарные отражения - это вполне удобная технология, когда вам нужно сделать зеркальную гладь на плоскости. Больше того, эта штука дружит ещё и с картами нормалей, позволяя сделать не просто глянцевую поверхность, но и какую-нибудь рябь на ней, например. Ещё больше того, это вам не отражения в пространстве экрана, а буквально камера, направленная по отражению от поверхности.
А что если мы хотим сделать отражения, например, для сферы? Вот мы и приплыли, проблема номер раз:
Сложные поверхности.
Как видно, когда нормаль поверхности сонаправлена нормали планарки, всё прекрасно. С небольшим наклоном скорость изменения поверхности по осям уже не сходится и отражение "плывёт". Типичный случай, когда наносится, например, текстура по одной плоскости. Большая же часть сферы, где отклонение уже слишком велико, просто отражает другими средствами движка.
В общем, захотели бы вы добавить своей воде объёмных волн, пришлось бы срочно перехотеть. И даже это ещё пол беды, однажды мы решим сделать следующие пол беды:
Матовые поверхности.
В мире довольно мало (почти) идеально глянцевых поверхностей. И хотя планарные отражения съедают хорошо карты нормалей, шероховатость на микроуровне они просто игнорируют:
Вопрос производительности.
Больше всего, конечно, волнуют людей не ограничения технологий, а кадры в секунду. Спешу всех порадовать: любая красивая штука много жрёт. Планарные отражения масштабируются плохо. Одна планарка на сцене в разрешении 1024x768 - это окей. 8 планарок в 4к с тонной геометрии - думайте сами. Правда куда вы эти 8 планарок поставите с учётом их ограничений, вопрос тоже открытый. Но давайте, поставим хотя бы 6 в пустой сцене на супер оптимизированном UE 4.27. 120 кадров, если что, упор от движка.
Трассировка масштабируется проще: один отскок, два отскока... Никаких перерендеров для каждого отдельного отражения, никаких отдельных плоскостей, просто настройка самих лучей. При этом трассировка лишена вышеназванных ограничений с поверхностями, да ещё под эту задачу сообразили аппаратные блоки. Тяжести вычислений это не отменяет, впрочем. Полноценная трассировка пути в Quake 2 RTX и Cyberpunk 2077 с врубленным RTX Overdrive, конечно, пушка и восторг, но не просто так рендеринг в реальном времени долго подобных вещей избегал. Да и на момент 2к24 я могу с ходу назвать только 2 таких игры, но уже сейчас их можно запустить на современных видеокартах. Это если вдруг кто-то хочет спросить, где же эта ваша трассировка в реальном времени и сколько можно доить население плохими карточками.
Не стоит забывать, что под полноценной трассировкой пути имеются в виду не только отражения. В приведённых примерах они делают буквально всю картинку.
А где нормальные зеркала?
Этот вопрос стоит задавать не технологии и не лично Куртке, а разработчикам, которые в крупных проектах делятся обычно на 2 типа:
- Пакистанец на аутсорсе, который учится на ходу у индуса
- Перегоревший калифорниец, который здесь ради денег на аренду в этом месяце
Авторы движков вроде того же UE недаром оставили кучу ползунков под любые задачи, а авторы обучающих роликов недаром разобрались и наснимали гайды. Возможно, кто-то когда-то их даже посмотрит, а пока терпим.