Pull to refresh

Comments 11

Правильно ли я вас понял? Мы рисуем в AO-тестуру всю геометрию в сцене, для каждого полигона в сцене мы вызываем геометрический шейдер, из которого вытягиваем ваш bounding volume, а в пиксельном шейдере реализуем пофрагментное пересечение того что есть в AO-буфере, с новым bounding volume, освещенным хитрым образом по вашей формуле затухания, и все это блендим?

Не кажется ли вам, что если все это так, то это выглядит довольно тяжелым для высокополигональных сцен, в особенности, геометрический шейдер? Хотелось бы увидеть оценку по скорости отрисовки в сравнении c SSAO.
Не начинайте. Сейчас придут артисты и рендерщики. Скажут, что это школьный уровень и без 10 лет на проде даже и статьи писать не стоит. Просто реально, человек не знакомый, не сможет оценить правильность. Для него это в любом случае будет «вау». Скриншоты не 4к. У стенок и в углу не терлись. разную геометрию не использовали. Нагрузочного тестирования нет было.
В действительности, автор данного подхода пытался придумать максимально точный алгоритм освещения, на подобии Ray Tracing'а. Однако, чтобы добиться такого результата пришлось пожертвовать производительностью. Вы верно подметили, данный алгоритм жадноват для сложной геометрии, но позволяет получить реалистичное освещение в real-time.
Вполне возможно, что оба алгоритма можно будет объединить, использовав достоинства каждого из них. Аналитический АО прекрасен для большой геометрии и можно будет для его расчёта рендерить низкополигональные лоды. А SSAO с небольшим радиусом использовать для локального повышения детализации, с учётом буфера нормалей. Так что, надеюсь, ещё не всё потеряно для реального времени.

P.S.: похожий способ объединения глобальных и локальных алгоритмов я уже видел у Крайтека (screen space self-shadowing)
Повтыкал в демку немного. По крайней мере в ней геометрический шейдер — не самая большая проблема. Хуже всего получается, когда какая-нибудь мелкая финтифлюшка рисуется крупным планом. Каждый полигон при этом рендерит огромный объём вокруг себя, все они накладываются друг на друга, выходит просто эпический overdraw и FPS падает на порядок. SSAO в этом плане куда стабильнее — он только от разрешения зависит. А для статики, вообще, достаточно лайтмепа.
Пример
далеко (25 FPS)


крупный план (1.4 FPS)



И это не считая артефактов от наложения объёмов друг на друга:
Артефакты





Так что да, технология интересная и потенциально может сделать картинку качественнее, но для реального времени имеет весьма узкое применение. Какие-нибудь низкополигональные прокси для динамических объектов разве что.
Проблема данной демки состоит в том, что там не проводилась интерполяция данных, как это делается в radiosity. Оттого мы и имеем таким артефакты в виде наложения теней друг на друга. Если посмотреть на radiosity:
Пример
image
Что-что, а интерполяция там как раз есть. А вот чего нет, так это учёта взаимного перекрытия объёмов. И если для выпуклой геометрии это ещё норм, и сценка с кубами выглядит почти идеально, то вот в остальных случаях это не так.
Хотя какой-то косяк с far-field там тоже наблюдается, но это надо исходники смотреть.
С тегах стоит C++, а где собственно какие то листинги?
Демо от NVIDIA с открытым кодом.
Шикарно. Аналитический АО, о котором я так давно мечтал. Спасибо за статью.
Я был бы очень счастлив, если бы моя статья хоть кому-то помогла. Вопреки всем ожиданиям, статья вышла скудновата.
Sign up to leave a comment.

Articles