» DX11 Графический конвейер
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.

DX11 Графический конвейер

English | Italian

table of contents

Графический конвейер

В шейдерах версии 5.0 появилось несколько новых стадий, которые мы видим на рисунке.

DX11 Pipeline

Input Assembler

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

Для инициализации IA необходимо пройти несколько шагов. Сначала мы создаем и инициализируем входные вертексные буферы. Затем создаем Input-Layout, который определяет каким образом информация из вертексного буфера поступает в IA. После этого привязываем созданные объекты к IA и сообщаем IA каким образом вершины собираются в примитивы. Потом вызываем методы для рендера примитивов.

Vertex Shader

Как и в предыдущих версиях DirectX, вертексный шейдер нужен для работы с вершинами или вертексами.

Обратите внимание на две вещи:

  • Так как добавились новые стадии шейдеров, не всегда нужно сражу же преобразовывать в проективное пространство
  • В случае instanced drawing, вертексный шейдер вызывается определенное число раз, которое можно рассчитать умножением числа вершин на число инстансов

Hull Shader

Первая стадия тесселяции. На этой стадии мы получаем информацию из вертексного шейдера в виде контрольных точек (patches).

Нужно создать Hull Shader Constant function, которая задаст факторы тесселяции (определяют интенсивность тесселяции).

Tessellation

Эту стадию нельзя запрограммировать, тесселятор графической карты сам поделит геометрию в соответствии с контрольными точками и факторами.

Domain Shader

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

Теперь мы можем делать с каждым сгенерированным вертексом что угодно (например, замещение)

Geometry Shader

Geometry shader позволяет изменять геометрию. Вместо вертексов на этой стадии мы обрабатываем примитивы (точки, линии, списки треугольников и т.п.)

Stream Output

Стадия опциональна, и при желании мы можем обратиться к ней и после стадии вертексного шейдера, и после геометрического шейдера.

Stream Output позволяет посылать измененные вертексы или примитивы непосредственно в новый буфер (чем-то напоминает рендеринг геометрии)

Rasterizer

Растеризация забирает примитивы и подготавливает их к стадии пиксельного шейдера (culling, clipping, depth test).

Pixel Shader

Работает так же как и раньше, когда мы обрабатывали каждый пиксель на экране.

Обратите внимание, что Shader Model 5 также может записывать пиксельные шейдеры сразу в буфер.

VVVV графический конвейер

Графический конвейер VVVV был слегка адаптирован для работы с DirectX 11.

DX11 vvvv pipeline

Geometry

Мы заменили меш DirectX9 на более гибкий. Index buffers теперь необязательны, и геометрия может быть любой из допустимых (в шейдер можно посылать точки и линии).

К геометрии прикрепили Drawer, который по умолчанию отрисовывает объект как в DirectX 9.

Drawer можно модифицировать и использовать дополнительные функции (Instancing, Indirect drawing, Per Vertex), но при этом мы не затронем геометрию

Layer

Система слоев также изменилась. Читайте об этом в отдельной статье, но если коротко:

  • Layer теперь предоставляет только render function, и к нему нельзя применять спреды как раньше
  • У Renderer появились настройки для работы с render function, и внутри render function есть доступ к заданному размеру view/projection/render
  • Layer'у можно назначить валидатор, для каждого слайса, который мы хотим отрисовать, можно вызвать валидатор, вне зависимости от того хотим ли мы рендерить наши слои, что позволяет уже на уровне слоев делать Frustrum Cull или GetSlice
  • Кроме встроенной семантики (VIEW,PROJECTION), мы также можем назначать свою собственную (включать любые типы данных, в том числе ресурсы). Это позволяет передавать данные в шейдеры, не создавая множество разных пинов. Такая кастомизированная семантика может быть обязательной, и шейдер без неё работать не будет

Shader node

Шейдерная нода теперь работает по-другому:

  • Validate Layout: проверяем семантику geometry layout и привязываем его ко входу вертексного шейдера из выбранного Pass'а. Учтите, что DX11 не позволяет терять семантику, например, если шейдер ожидает на вход NORMAL, но в геометрии этого нет, то шейдер просто НЕ будет работать (детально об этом можно узнать по запросу Layout Valid output pin)
  • Set Render State: Render states привязываются как и в previous pipeline
  • Apply Semantics: Мы используем семантику Renderer and Layer (глобальную семантику)
  • Build object render settings: Мы пишем небольшой класс, включающий Current Geometry (включая bounding box), и World transform
  • Per Slice Validator : На каждый вызов мы посылаем настройки рендера и объекта, а валидаторы решают нужно ли отрисовать каждый слайc.
  • Apply Per object semantics: Sets any semantic like WORLD, WORLDVIEW...
  • Draw : Доступ к отрисовке геометрии и к обработке отрисовки

anonymous user login

Shoutbox

~8h ago

joreg: But first: This Friday in Berlin: Join our full day "Getting started with Generative Design Algorithms" workshop https://nodeforum.org/announcements/workshop-getting-started-with-generative-design/

~12h ago

joreg: In #Linz for #ArsElectronica? Join us for a free 2 days #vvvv workshop sponsored by businesses/responsive-spaces-gmbh Apply here: 2-day-gamma-vvvvorkshop-at-responsive-spaces-in-linz

~2d ago

joreg: Need your custom dose of #vvvv training? Join us at our studio in #berlin: vvvv-training-at-the-source

~8d ago

~12d ago

~12d ago

domj: Dev stream: Painting with light with a Vive controller, developing using VL and Schéma. Start at 17:00 https://www.twitch.tv/dominikjancik

~14d ago

joreg: July as it happened: vvvvhat-happened-in-july-2019 #vvvv

~14d ago

levi: @mrboni thanks mrboner. solved it by turning all the lights to strobe mode so framerate drops were actually a relief :P . love

~15d ago

joreg: reminder: this thursday, just before the patching circle, there is a free 2h intro to #vvvv gamma: free-vvvv-intro-workshops-this-summer-in-berlin