Вода — один из наиболее визуально сложных элементов интерактивных сцен. Её поверхность постоянно движется, отражает и преломляет свет, взаимодействует с окружением и объектами. Полная физическая симуляция поверхности воды требует решения уравнений волновой динамики, что вычислительно дорого [1, с. 267]. Практические приложения используют упрощённые подходы: процедурные волны, основанные на шумовых функциях, или GPU-симуляции волн на сетке высот [2]. Целью статьи является рассмотрение методов визуализации воды, её физического и визуального взаимодействия с окружением.
Представление поверхности воды
Простейший подход — процедурные волны , основанные на суперпозиции синусоидальных волн различных частот, амплитуд и направлений [3]. Для каждой точки поверхности вычисляется вертикальное смещение как сумма нескольких гармонических волн, что создаёт реалистичную рябь и волны без явной симуляции. Вычисление выполняется в вершинном шейдере, позволяя создавать волны любого размера.
Более гибкий подход — height map (карта высот), в которой хранятся высоты поверхности воды в узлах сетки [4, с. 283]. Height map можно вычислять через GPU-симуляцию волновых уравнений (FFT-основанные методы или решение уравнений мелкой воды) или обновлять на основе взаимодействия с объектами [5]. Нормали height map вычисляются в реальном времени через дифференцирование, что позволяет избежать хранения отдельных карт нормалей.
Отражения, преломления и взаимодействие
Вода является отражающей поверхностью, требующей расчёта отражения окружения. Простой подход — отражение в реальном времени через дополнительный проход рендеринга: сцена рендерится с отражённой камерой в текстуру, которая затем используется при рендеринге воды [6]. Для больших водных поверхностей (океаны) часто используется планарное приближение : отражение рассчитывается только для плоской части воды, что позволяет уменьшить стоимость.
Преломление света при прохождении через воду обычно реализуется путём смещения текстурных координат при выборке подводной сцены на основе нормалей поверхности воды [4, с. 290]. Для добавления взаимодействия воды с падающими объектами (брызги, волны от удара) используются волновые буферы (wave buffers): падение объекта записывается в область поверхности воды, создавая возмущение, которое распространяется через сетку волн [7].
Оптимизация и современные методы
Для больших открытых сцен с протяжёнными водными поверхностями полная симуляция волн всей поверхности вычислительно недопустима. Оптимизации включают: работу на пониженном разрешении сетки высот, асинхронное обновление (не все узлы обновляются каждый кадр), и применение LOD (level of detail) к отражениям [8]. Часто используется проективная сетка (projected grid): сетка воды строится в пространстве экрана, что обеспечивает равномерную детализацию для видимой части поверхности [9].
Сравнение методов представлено в таблице 1.
Таблица 1
Сравнение методов симуляции воды
|
Метод |
Основное преимущество |
Основное ограничение |
|
Процедурные волны |
Простота, любой размер поверхности |
Нет взаимодействия с объектами |
|
Height map (простая) |
Простая интеграция взаимодействия |
Ограниченное разрешение |
|
FFT-симуляция волн |
Физическая корректность волн |
Высокая вычислительная стоимость |
Заключение
Вода остаётся сложным для реализации элементом в рендеринге реального времени, требующим компромисса между визуальным качеством, физической корректностью и вычислительной производительностью. Процедурные волны остаются практичным решением для статичной воды, в то время как GPU-симуляции волн на основе height map позволяют добавлять динамическое взаимодействие. Комбинирование простых процедурных волн с отражениями в реальном времени и преломлениями обеспечивает визуально убедительные результаты при приемлемой стоимости, что делает эту комбинацию стандартом в современных игровых движках.
Литература:
- Akenine-Möller T., Haines E., Hoffman N. Real-Time Rendering. — 4th ed. — Boca Raton: A K Peters / CRC Press, 2018. — 1198 p. — ISBN 978–1-1386–2700–0.
- Tessendorf J. Simulating Ocean Water // Simulating Nature: Realistic and Interactive Techniques. SIGGRAPH 2001 Course Notes No. 47. — New York: ACM, 2001. — 26 p. — URL: https://people.computing.clemson.edu/~jtessen/reports/papers_files/coursenotes2004.pdf
- Fournier A., Reeves W. T. A simple model of ocean waves // Computer Graphics (Proceedings of SIGGRAPH ’86). — New York: ACM, 1986. — Vol. 20, No. 4. — P. 75–84. — DOI: 10.1145/15922.15894.
- Kryachko Y. Using Vertex Texture Displacement for Realistic Water Rendering // GPU Gems 2 / ed. by M. Pharr. — Addison-Wesley, 2005. — Ch. 18. — P. 283–294. — URL: https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-18-using-vertex-texture-displacement
- Tessendorf J. Interactive Water Surfaces // Game Programming Gems 4 / ed. by A. Kirmse. — Hingham: Charles River Media, 2004. — P. 265–274. — ISBN 978–1-58450–295–6.
- Sousa T. Generic Refraction Simulation // GPU Gems 2 / ed. by M. Pharr. — Addison-Wesley, 2005. — Ch. 19. — P. 295–305. — URL: https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-19-generic-refraction-simulation
- Bridson R. Fluid Simulation for Computer Graphics. — 2nd ed. — Boca Raton: A K Peters / CRC Press, 2015. — 280 p. — ISBN 978–1-4822–3283–7.
- Mittring M. Finding next gen: CryEngine 2 // ACM SIGGRAPH 2007 Courses. — New York: ACM, 2007. — P. 97–121. — DOI: 10.1145/1281500.1281671.
- Johanson C. Real-time Water Rendering: Introducing the Projected Grid Concept: Master Thesis. — Lund: Lund University, 2004. — 38 p. — URL: https://fileadmin.cs.lth.se/graphics/theses/projects/projgrid/projgrid-lq.pdf

