среда, 9 мая 2018 г.

NVIDIA OptiX

На GDC 2018 NVIDIA представила RTX - технологию трассировки лучей в реальном времени на GPU. Это событие называют эпохальным - наконец-то трассировка будет доступна не только в рендер-движках, но и в играх!


Основным методом рендеринга в играх сегодня является растеризация - отрисовка двумерных треугольников с интерполяцией вершинных атрибутов. Преимуществом растеризации всегда была простота и вычислительная дешевизна, что позволило в конце 1990-х годов перенести ее на видеоускорители. Однако возможности ее сильно ограничены, поскольку традиционный программируемый конвейер растеризации предполагает локальность данных: вершинный шейдер обрабатывает только одну вершину, пиксельный шейдер - только один пиксель. К тому же, на отрисовку обычно отправляется только видимая на экране часть сцены - то есть, ограниченная усеченной пирамидой видимости. Между тем, точная реализация многих оптических феноменов требует полной информации об окружении: это, например, тени, отражения, преломления, глобальное освещение и т.д. Их невозможно рассчитать "честно" без доступа ко всей сцене целиком. Трассировка лучей решает эту проблему, поскольку в ней информация о сцене всегда доступна полностью, однако видеокарты и графические API до сих пор не предоставляли встроенных средств для трассировки лучей. В последние годы стали появляться гибридные графические движки, объединяющие растеризацию с некоторыми элементами трассировки - например, для рендеринга тех же отражений. Обычно в таких случаях применяются упрощенные алгоритмы трассировки в экранном пространстве (screen space), легко реализуемые в рамках традиционного графического конвейера, но не являющиеся "честными".

Появление RTX, фактически, смещает всю "координатную систему" современного рендеринга: становится возможным полный отказ от растеризации в пользу трассировки. Для использования RTX в приложениях NVIDIA предлагает OptiX - специальный API для C, при помощи которого можно программировать и выполнять трассировщики лучей.

Пайплайн трассировки выглядит, в общих чертах, следующим образом:

1. Для каждого пикселя кадра GPU выполняет шейдер генерирования луча (ray generation shader). Он похож на вычислительный шейдер со встроенной функцией для обнаружения пересечений геометрии сцены с произвольным лучом.

2. При потенциальном пересечении луча со сценой выполняется шейдер пересечения (intersection shader). API трассировки предоставляет готовый оптимизированный шейдер пересечения для треугольников. Пользователь может задать свои шейдеры пересечения для других примитивов и параметрических поверхностей. Обнаруженное пересечение может быть проигнорировано - если, например, оказывается, что в данной точке полностью прозрачная текстура.

3. Если обнаружено пересечение, то оно обрабатывается шейдером ближайшего пересечения (closest hit shader) - именно в нем происходит вычисление цвета пикселя. В противном случае луч передается шейдеру пропуска (miss shader) - он может использоваться, например, для присвоения пикселю цвета фона.

OptiX работает с GPU на базе Kepler/Maxwell/Pascal, однако для достижения максимальной производительности нужна новая архитектура Volta - в потребительском секторе она представлена, на момент написания статьи, видеокартами Titan V и Quadro GV100, стоиомсть которых пока слишком высока, чтобы говорить об их массовом распространении. Однако начало положено - NVIDIA подвела технологию к черте, которая отделяла реальность от фантастики: через 5-10 лет трассировка лучей будет в каждом геймерском компьютере.

Подробнее почитать о OptiX можно на сайте NVIDIA: https://developer.nvidia.com/optix

Для скачивания SDK требуется регистрация в NVIDIA Developer Program.

Комментариев нет:

Отправить комментарий