Деталі проектованого горизонту сітки на воді


13

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

затінена водна поверхня

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

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

Будь-які ідеї?

Відповіді:


7

Я вважаю, що поширеним рішенням є розділення трансформації камери, яка використовується для проектування сітки, від трансформації камери, яка використовується для візуалізації сітки. У перспективах, близьких зверху вниз, дві камери збігаються, але оскільки камера перегляду наближається до горизонтальної точки зору, проекційна камера відхиляється і намагається зберегти мінімальний нахил, тобто вона зависає десь над оглядовою камерою і злегка дивиться вниз.

Складний біт - це переконання, що поле зору проекційної камери завжди охоплює область сцени, видно з камери візуалізації. Я не маю під рукою ресурсу, який би детально розраховував, як обчислити відповідні перетворення, і це може бути стомлено отримати вручну.

Інше рішення полягає в захопленні панелі інструментів для обробки сигналів: артефакти, які ви бачите на вашому зображенні, по суті є нездатними, викликані недостатньою вибіркою поля висоти хвилі за проектованою сіткою. Тому одним із варіантів є фільтрування висотного поля належним чином, залежно від проектованої площі комірки сітки. Я вважаю, що це використовується в режимі офлайн-відтворення океанів, і це, по суті, гарантує, що хвилі на горизонті вирівнюються. Однак я не впевнений, наскільки це можливо при візуалізації в режимі реального часу, оскільки вам знадобиться якісна анізотропна фільтрація, щоб зробити такий підхід розумним.


Дякую за пораду, я зараз обрала ліниве рішення. Я використовую функцію у вершинній шейдері, яка визначає ослаблення хвилі на відстані від камери.
Gábor Szalóki

6

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


3

Деякі програми, такі як Майя, вирішують це, використовуючи полярну (або фактично декартову, яка перетворює полярну відстань) приблизно так само, як і сітка, орієнтована на положення камери. Ця настройка додає більше деталей, де вона налічує найбільше. Потім вони покладаються на звичайну обробку шейдерів на подальших діапазонах. Є місце для поліпшення курсу. Ви холодно модифікуєте цей підхід і маєте будь-яку іншу форму, яка збільшує щільність сітки у напрямку до камери. Користь у тому, що ви можете розтягнути ефект до горизонту, не турбуючись про шов.

Трюк у тому, щоб у цьому випадку не зміщувався переміщувач, полягає в тому, що ви поступово зменшуєте переміщення у міру віддалення. Тоді ви просто використовуєте звичайну модифікацію в піксельному шейдері в міру подальшого використання. Це простіше відфільтрувати, ніж потрібно фільтрувати точний край шилует. Крім того, якщо ви можете бачити, що далеко, то ваші аванси, швидше за все, досить плоскі.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.