dxr nvidia что это

DXR на картах GeForce GTX без RT-ядер

До недавнего времени DXR (DirectX Raytracing) работал только на видеокартах серии GeForce RTX с выделенными блоками для ускорения трассировки лучей. Но разработчики находят новые пути для оптимизации DXR, некоторые из которых позволяют реализовать простые эффекты с небольшим числом лучей и приемлемой производительностью полностью программным способом.

С выходом нового драйвера Game Ready версии 425.31 WHQL миллионы GPU на архитектурах Pascal и Turing без специальных RT-ядер получили программную поддержку новейших библиотек Microsoft для трассировки лучей. Ниже приведен полный список совместимых дискретных карт и их аналогов в ноутбуках.

Благодаря новому драйверу и сотрудничеству с разработчиками в области оптимизации производительности, базовые эффекты трассировки в играх стали доступны даже обладателям карт без аппаратного ускорения.

Если ваша карта оказалась в списке выше, то для активации трассировки потребуется Windows 10 64-bit с октябрьским 2018 обновлением (версии RS5 1809, или новее), также необходимо установить последний драйвер Game Ready версии 425.31 WHQL.

Производительность на GeForce RTX и GTX

После анонса поддержки DirectX Raytracing на картах без RT-ядер, многие справедливо сомневались, что производительности программной реализации хватит даже для минимальных настроек.

Но, как оказалось, простые эффекты, требующие запуска небольшого числа лучей, могут работать с приемлемой скоростью даже при программном поиске пересечения луча с геометрией сцены.

К таким эффектам можно отнести отражения на средних и низких настройках DXR в Battlefield V.

При средних и низких настройках DXR в Battlefield V отражения присутствуют на поверхностях с коэффициентом гладкости от 0.9 до 1 (абсолютно гладкая поверхность). Это значит, что отражения применяются только к очень гладким материалам, таким как полированные металлы, вода и другим. В случае гладких поверхностей, лучи при отражении летят в одну сторону, поэтому их проще обрабатывать параллельно программным способом.

Отставание карт без RT-ядер возрастает при увеличении разрешения экрана и отражений, а также при применении рассеянных отражений к более грубым материалам с коэффициентом гладкости от 0.5 и выше, что соответствует Ultra настройкам DXR.

Как видно, с Ультра настройками DXR и в 1440p поиграть получится только на карте уровня RTX 2080 и выше.

Попробовать DXR можно и в Shadow of the Tomb Raider, правда, в местах с большим числом теней, таких как джунгли, средняя производительность может быть значительно ниже на картах без аппаратных блоков.

На средних настройках DXR в игре, тени трассировкой применяются только для небольших точечных источников света, подвижных точечных источников и неоновых вывесок, тогда как для теней от солнца применяются более простые карты теней. Именно средние настройки мы и рекомендуем для карт без RT-ядер. Но для по-настоящему комфортной игры c трассировкой для всех источников света все же потребуется карта уровня RTX 2070 с аппаратным ускорением.

Хуже всего для карт с программной реализацией DXR дела обстоят в Metro Exodus. Причина в том, что для глобального освещения используется не только много лучей, но и все эти лучи летят в случайно выбранных направлениях внутри полусферы отцентрированной относительно перпендикуляра к поверхности в точке экрана. Поскольку при глобальном освещении все лучи летят в разных направлениях, программный метод здесь справляется хуже всего.

С ростом разрешения и сложности трассировки производительность карт без аппаратного ускорения падает сильнее:

В этом случае младшая карта серии RTX быстрее 1080 Ti более чем в 1.5 раза.

RTX демонстрации

В качестве бонуса предлагаем вам ознакомиться с разнообразными интересными техническими демонстрациями, в каждой из которых используется сразу несколько эффектов сделанных при помощи трассировки лучей. Скачать их можно по ссылкам ниже.

Для получения наилучших впечатлений от игр с поддержкой эффектов трассировки лучей DXR, мы рекомендуем использовать видеокарты серии GeForce RTX, которые обеспечивают наиболее высокие результаты производительности благодаря наличию специальных RT-ядер для обработки эффектов трассировки.

Источник

DirectX raytracing — всплываем

В 2018 году компания Microsoft анонсировала raytracing API (DXR) как часть DirectX 12. Подход рейтрейсинга заставляет полностью переосмыслить способ ренедринга трехмерных сцен, смещающий классический подход растеризации на второй план. АПИ модернизируются, разрабатываются более производительные GPU, разработчики пакетов визуализации пробуют новые возможности. Однако даже на наиболее производительных видеокартах мощности хватает на генерирование всего нескольких лучей на пиксель для обеспечения стабильной частоты смены кадров. К тому же, производительность во многом зависит от сложности материалов и сцены. Но уже сегодня продвинутые алгоритмы шумоподавления и аккумуляции результата освещенности позволяют достичь высокой степени реализма. Все это мотивирует к экспериментам в данной области.

Возможность трассировки лучей на GPU стала возможна относительно недавно. В 2009 году вышел DirectX 11 с compute shaders — это дало толчок в развитии вычислений не связанных с графикой. Однако конструирование ускоряющих структур ложилось полностью на плечи программиста, что замедляло разработку. Получили распространение специализированные библиотеки по пересечению, например, Radeon Rays от AMD. В DXR ускоряющие структуры представлены по принципу черного ящика и пересечение происходит с помощью специальных аппаратных блоков. Трассировка лучей была так же добавлена в Vulkan в качестве расширения VK_NV_ray_tracing для карт Nvidia. В марте 2020 с небольшими изменениями вышло расширения VK_KHR_ray_tracing, перестало быть vendor-specific, возможно его включат в спецификацию Vulkan 1.3. Планируется полноценная работа трассировки лучей и в AMD до конца 2020. Повсеместная поддержка повышает перспективность технологии.

Концептуально DXR предоставляет возможность пересечения лучей с предварительно загруженными геометрическими объектами. В местах пересечений возможно выполнение определенных пользователем программ — шейдеров. Грубо говоря, объект это массив треугольников. Однако уточняющая форма, которая, например, говорит о прозрачности объекта может определяться и во время выполнения в отдельном шейдере. Такая возможность полезна, если степень прозрачности задается текстурой или в случае полностью процедурно сгенерированных объектов (облака, огонь). Любые события, которые возникают на пути луча (hit, miss, procedural hit, closest hit), подвержены программированию, например, в месте пересечений можно генерировать вторичные лучи, продолжающие движение. Такой pipeline похож на распространение света.

Читайте также:  iso стандартизация что это такое простыми словами

Окружение

Для запуска требуется DXR-совместимый GPU Nvidia RTX 2060 и выше. Windows SDK 19041 (для нашего примера подойдет и более раннее, но официальные Miscrosoft сэмплы ориентируются именно на эту версию), в качестве IDE используется Visual Studio 2019, язык C++.

Терминология

Как и в любой трассировке в DXR все начинается с генерирования необходимых лучей, за это отвечает отдельный raygen-шейдер. Глобально на стороне программы вызывается ID3D12GraphicsCommandList4::DispatchRays() c необходимым количеством лучей, а конкретные направления задает шейдер с помощью TraceRay(). Трассировка производится на определенной top level acceleration structure. Дальнейшее выполнение может происходить по разным сценариям, зависящим от сцены. Например, могут обрабатываться всевозможные пересечения на пути следования луча, либо вызываться отдельные шейдеры для процедурной геометрии, либо обрабатываться только ближайшее пересечение (closest hit). Для простоты мы рассмотрим последний случай, общий иллюстрирует следующая схема.

В процессе выполнение может передаваться разным miss и hit-шейдерам. Инстансы шейдеров для одного луча могут обмениваться небольшой областью памятью называемой payload — обычно это и есть результат вычислений. Ресурсы могут передаваться и быть видимым глобально для всех шейдеров с помощью стандартных средств DirectX, в этом случае создается global root signature. Либо локально per-shader ресурсы, в этом случае на каждый шейдер создается своя local root signature и передача параметров осуществляется с помощью Shader binding table. В такой ситуации надо следить, чтобы регистры глобальных ресурсов не пересекались с регистрами локальных.

Инициализация

На высоком уровне вся настройка делится на следующие этапы:

Разберем подробно эти этапы.

Bottom-level acceleration structure (BLAS)

Объект представляет собой список геометрических объектов, где каждый объект — это массив треугольников. Один объект в BLAS для удобства в дальнейшем будем называть инстансом. Один BLAS может состоять из множества инстансов. Треугольники могут задаваться напрямую как тройки вершин либо индексироваться отдельным буфером. Генерирование BLAS происходит на GPU, и поэтому требует отдельного command list и небольших синхронизаций. Для генерирования требуется итоговый буфер, который и будет содержать BLAS а так же некоторое количество памяти для внутренних нужд (scratch-буфер). DirectX 12, как явное API, предоставляет возможность узнать необходимые размеры с помощью метода ID3D12Device5::GetRaytracingAccelerationStructurePrebuildInfo. В итоге создается буфер с флагом D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE — содержит все необходимые данные для эффективного пересечения лучей с треугольниками.

Основная структура здесь D3D12_RAYTRACING_GEOMETRY_DESC — описывает один инстанс в BLAS. Необходимо передать буфер вершин и их лэйаут (а так же index-buffer при наличии):

Заполняем общую информацию о BLAS:

Top-level acceleration structure (TLAS)

TLAS представляется матрицей трансформации с уже созданными BLAS и флагами специфичными для данного инстанса. Она может инстанциировать один и тот же BLAS много раз, используя разные матрицы для рендеринга одинаковых моделей в разных позициях. Создание TLAS во многом похож на BLAS — здесь так же требуется дополнительный scratch-буфер. Более того, мы можем использовать один и тот же scratch-буфер, так как TLAS создается после BLAS. В нашем случае записываем в TLAS две одинаковые модели с разными матрицами трансформации:

Заполнение общей информации о TLAS (D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS и D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC) производится аналогично BLAS.

Raytracing pipeline

Как и для graphic и compute нам требуется raytracing pipeline state object — это текущая конфигурация трассировки. RT pipeline состоит из множества подобъектов и объектов-ассоциаторов, которые связывают уже созданные подобъекты. Для удобства будем использовать вспомогательный класс CD3DX12_STATE_OBJECT_DESC и метод CreateSubobject( ).

Shader binding table (SBT)

SBT — это соединение геометрических данных и шейдеров вместе. Фактически таблица хранит информацию о том, какие нужно выполнить шейдеры и с какими аргументами для инстансов с которыми произошло пересечение, поэтому это часть подверженная активному изменению с точки зрения программиста. Технически это не является таблицей, она представляется размеченной GPU-памятью, в которой записаны идентификаторы шейдеров и аргументы по определенным правилам. Но для удобства продолжим называть ее таблицей.

Одна ячейка в таблице называется shader record. В нашем случае при конструировании TLAS мы указали что нулевой инстанс будет смотреть на нулевую запись, первый — на первую. Таким образом в рантайме придут разные константы. В общем случае формула расчета индекса в таблице может зависеть не только от номера геометрического инстанса в TLAS и BLAS, но и от типа лучей и передаваемых аргументов в TraceRay(), однако в данной статье мы рассматриваем самый простой случай.

Глобально все делится на 3 шейдера: ray generation, hit и miss, соответственно, можно сказать, что и таблиц буде тоже три. Мы можем разместить таблицы в разных буферах, либо в одном. В последнем случае нам нужно правильно рассчитать GPU-адрес на начало каждой из таблиц, которые принимает DispatchRays(). В таблице может быть любое количество shader record-ов.

Размер буфера который нам нужно аллоцировать для одной таблицы это размером одного shader record-a умноженный на их количество. Для raygen и miss у нас будет по одному шейдеру без каких либо локальных аргументов, поэтому размер shader record-a минимально возможный. Для глобальных аргументов, как мы уже знаем, которые видны всем шейдерам, мы создаем отдельную root signature, ее аргументы не записываются в SBT. Между shader record требуется выравнивание D3D12_RAYTRACING_SHADER_RECORD_BYTE_ALIGNMENT (сейчас 32 байта).

Читайте также:  что делать если защемило колено и не можешь разогнуть ногу

Идентификатор шейдера представляет собой void*, который возвращает GetShaderIdentifier() из объекта ID3D12StateObjectProperties, последний можно получить из COM-интерфейса созданного ранее raytracing pipeline. Для raygen-шейдера (miss аналогично) это выглядит примерно так:

Указатель мы записываем в начало нашего буфера. SBT для raygen и miss шейдеров сформированы.

Для hit мы передаем в шейдер float4 и здесь более интересная ситуация. Запись аргументов в SBT очень похожа на установку в root signature: константы записываются напрямую либо передается virtual GPU-address/GPU-handle. В нашей ситуации два инстанса необходимо обработать одним шейдером но с разными constant buffer, поэтому в hit SBT будет два shader record-а. Запись состоит из 32-байтного идентификатора и 4×4-байт константы, всего 48, но из-за выравнивания получится 64 байта. Расположение записей иллюстрируются следующей картинкой:

Шейдеры

В отличие от классического подхода vertex-fragment shader в трассировке требуется минимум 3: raygen, hit, miss.

raygen:

Задаем исходную точку и направление луча на основании позиции пикселя и системы координат камеры. Затем передаем TLAS, маски и набор параметров, отвечающих за расчет выполнения определенных шейдеров в SBT. TraceRay() возвращает payload после серии пересечений и результат записываем в выходой буфер. Идентификатор [shader(«raygeneration»)] говорит системе, что это именно шейдер, генерирующий лучи, а вот название функции «RayGen» может быть любое, его нужно будет экспортировать после компиляции.

closesthit

Выполняется только в случае ближайшего к камере пересечения. В результате мы должны записать что-нибудь в payload. В шейдер передается буфер вершин и нормалей и цвет текущей модели. Барицентрические координаты и номер треугольника передаются системой. Находим нормаль в точке пересечения с помощью барицентрических координат, и производим расчет освещения.

Наиболее просто выглядит miss.

В этом случае у нас нет пересечения — записываем цвет фона.

Main loop

Основная выдержка из main loop выглядит следующим образом:

Заключение

В статье мы рассмотрели основные объекты необходимые для начала работы с DXR, а так же применили эти знания на практике. Намеренно были пропущены вопросы инициализации DirectX, загрузки моделей, компиляции шейдеров, и т.д., которые не относятся к теме. В следующих статьях планируется сместить акцент на, собственно, графику, нежели работу с API.

Источник

поясните за RTX и прочие новые технологии DXR и тп

25 Feb 2019 в 17:30

25 Feb 2019 в 17:30 #1

я реально не понимаю. в RTX это название серий видеокарт, а DXR это название самой технологии?

и что это вообще такое? я правильно понимаю, что с DXR есть какой либо источник света, и он распространяется в зависимости от препятствий(как в ирл)?

а как тогда без DXR? или я все еще не понял?

вот тут различие действительно видно: тайминг 1:11, ссылка с таймингом, но так вроде не работает

есть ли какие нибудь видосы, где прям четко видна разница между включенной технологией и без?

правда ли что всего 2 игры с RTX? метро и бф5?

еще говорят, что и там, и там не полноценный РТХ, мол в БФ5 это отражения, а в метро освещение? правда ли? и почему так сделали, а не полноценный РТХ??

25 Feb 2019 в 17:34 #2

Хуанг нассал в уши со своим rtx

Если посадить людей и не сказать что есть rtx то они даже не заметят разницы, ну и фпс просвживает знатно

25 Feb 2019 в 17:35 #3

Хуанг нассал в уши со своим rtx

Если посадить людей и не сказать что есть rtx то они даже не заметят разницы, ну и фпс просвживает знатно

на видосах разница очевидна же

25 Feb 2019 в 17:39 #4

я реально не понимаю. в RTX это название серий видеокарт, а DXR это название самой технологии?

и что это вообще такое? я правильно понимаю, что с DXR есть какой либо источник света, и он распространяется в зависимости от препятствий(как в ирл)?

а как тогда без DXR? или я все еще не понял?

вот тут различие действительно видно: тайминг 1:11, ссылка с таймингом, но так вроде не работает

есть ли какие нибудь видосы, где прям четко видна разница между включенной технологией и без?

правда ли что всего 2 игры с RTX? метро и бф5?

еще говорят, что и там, и там не полноценный РТХ, мол в БФ5 это отражения, а в метро освещение? правда ли? и почему так сделали, а не полноценный РТХ??

Технология нвидиа называется ray tracing, а dxr это directxr графический api майкрософт на сколько я знаю.
В метро четко видна разница с ртх и без.
Вроде в кваке есть лучи, но я сам не знаю.
Да в бф это отражения а метро освещение, потому что пока не хватает мощностей.

25 Feb 2019 в 17:48 #5

на видосах разница очевидна же

25 Feb 2019 в 17:50 #6

Технология нвидиа называется ray tracing, а dxr это directxr графический api майкрософт на сколько я знаю.
В метро четко видна разница с ртх и без.
Вроде в кваке есть лучи, но я сам не знаю.
Да в бф это отражения а метро освещение, потому что пока не хватает мощностей.

ща гляну видос сравнения в метро. разница действительно в некоторых местах колоссальная. только я не пойму, если сейчас технология реально работает как свет в ирл, как было раньше? т.е. во всех старых играх разрабы вручную наносили освещение на каждую поверхность? или какая то устаревшая технология есть?

Читайте также:  gfx engine clock override что

25 Feb 2019 в 17:52 #7

еще минимум лет 5 эта технология никому будет не нужна ввиду нехватки ресурсов и дороговизны. не знаю для чего нвидия ее высрали

25 Feb 2019 в 17:52 #8

ого, не знал что часть разрабов из сталкера.

а разве неравномерное освещение не есть тени?

25 Feb 2019 в 17:53 #9

Искусственные источники света, заранее пререндер отражений.

25 Feb 2019 в 17:54 #10

ща гляну видос сравнения в метро. разница действительно в некоторых местах колоссальная. только я не пойму, если сейчас технология реально работает как свет в ирл, как было раньше? т.е. во всех старых играх разрабы вручную наносили освещение на каждую поверхность? или какая то устаревшая технология есть?

Не знаю, может и сами рисовали, я никогда не задавался такими вопросами

25 Feb 2019 в 18:02 #11

ого, не знал что часть разрабов из сталкера.

а разве неравномерное освещение не есть тени?

ну типа сложно на пальцах объяснить. вот челик на скрине, если присмотреться справа затенён больше чем слева. т.к. слева идёт источник света и освещение при этом переходит равномерно:

только это не игровой скрин вроде как. но я для примера что б понятно было

25 Feb 2019 в 18:07 #12

Щас бы в пререндере пытаться найти разницу.

25 Feb 2019 в 18:11 #13

Поясните, у меня 1060 6 гиг и я поставил метро. Я в принципе ртх не увижу? Или нет?

пы.сы. Да, нуб, не шарю, не рофл и тд

25 Feb 2019 в 18:12 #14

Поясните, у меня 1060 6 гиг и я поставил метро. Я в принципе ртх не увижу? Или нет?

пы.сы. Да, нуб, не шарю, не рофл и тд

25 Feb 2019 в 18:14 #15

мне почему-то картинка без RTX нравится больше

Спасибо. Для этого нужна видяха 20хх серии?

25 Feb 2019 в 18:14 #16

Поясните, у меня 1060 6 гиг и я поставил метро. Я в принципе ртх не увижу? Или нет?

пы.сы. Да, нуб, не шарю, не рофл и тд

RTX это только 2*** серия, офк в своей 1066 ты не увидишь этого

25 Feb 2019 в 18:15 #17

я реально не понимаю. в RTX это название серий видеокарт, а DXR это название самой технологии?

и что это вообще такое? я правильно понимаю, что с DXR есть какой либо источник света, и он распространяется в зависимости от препятствий(как в ирл)?

а как тогда без DXR? или я все еще не понял?

вот тут различие действительно видно: тайминг 1:11, ссылка с таймингом, но так вроде не работает

есть ли какие нибудь видосы, где прям четко видна разница между включенной технологией и без?

правда ли что всего 2 игры с RTX? метро и бф5?

еще говорят, что и там, и там не полноценный РТХ, мол в БФ5 это отражения, а в метро освещение? правда ли? и почему так сделали, а не полноценный РТХ??

У Логвинова на канале есть сцены показывающий разницу с RTX и без в Метро.

25 Feb 2019 в 18:15 #18

Технология нвидиа называется ray tracing, а dxr это directxr графический api майкрософт на сколько я знаю.
В метро четко видна разница с ртх и без.
Вроде в кваке есть лучи, но я сам не знаю.
Да в бф это отражения а метро освещение, потому что пока не хватает мощностей.

Да, в Quake 2 один немец запилил ртх, верно.

25 Feb 2019 в 18:15 #19

Щас бы в пререндере пытаться найти разницу.

вот ингейм. на 1:06 и 4:45 прям явно видно, что РТХ лучше

25 Feb 2019 в 18:28 #20

Короче ГТ эт круто типо, Дорохов, бохато.

25 Feb 2019 в 18:51 #21

еще один тупой вопрос, у чела выше в настройках будут неактивные тумблеры РТХ и ДЛСС?

вот ингейм. на 1:06 и 4:45 прям явно видно, что РТХ лучше

все еще не вижу за что платить по 100к

25 Feb 2019 в 19:20 #22

все еще не вижу за что платить по 100к

достаточно 30к, ну или

45, если 2080 в фулхд

25 Feb 2019 в 19:49 #23

еще один тупой вопрос, у чела выше в настройках будут неактивные тумблеры РТХ и ДЛСС?

вот ингейм. на 1:06 и 4:45 прям явно видно, что РТХ лучше

Я играл с ртх, я знаю, что разница есть. Но ты мне кидаешь видос, который прошел рендер перед ютубом, а потом был еще и сжат самим ютубом. Это глупо, если мы говорим об объективности

26 Feb 2019 в 00:08 #24

весь этот ртх сейчас привязан за уши

понятно что разница есть, но раньше обходились динамическим освещением и всеми вытекающими от туда HBAO+ и тд

а сейчас просто сделали, жрите ртх или статический свет

кроме как отражений ни какой разницы заметной нет

помню тож самое было с 8800GT видюхой которая позволяла запускать DX10 игоры если не ошибаюсь

но толку от этого ни какого не было

26 Feb 2019 в 02:34 #25

я реально не понимаю. в RTX это название серий видеокарт, а DXR это название самой технологии?

Источник

Сказочный портал