» 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

~1h ago

herbst: Just tried to show some people how concise and condensed vvvv looks even for complex stuff. Are there complex screenshots anywhere?

~1d ago

domj: Midweek Patch Therapy today at 17:30 CET! Hope to see you there https://therapy.domj.net

~2d ago

domj: Schéma + Orca + Pilot, a love triangle https://www.twitch.tv/videos/639199128

~2d ago

joreg: Your next chance for an easy introduction to the all-new #vvvv gamma: This friday 6pm CET: https://thenodeinstitute.org/event/introduction-to-creative-coding-with-vvvv-gamma-english/

~5d ago

~8d ago

domj: Stuck in your patching or eager to share what you made or came across? Join Midweek Patch Therapy at 17:30 https://therapy.domj.net/

~9d ago

david: vvvv meetup 3. new stream link. again youtube made us nuts.. please send everybody to https://youtu.be/pa3HRQ7kj6w

~9d ago

joreg: Reminder: Join us this evening, 8pm CET for the 3rd worldwide #vvvv meetup: 3.-worldwide-vvvv-meetup

~9d ago

sinus: @evvvvil: very impressive stuff! keep on marching the rays!You´ll never walk alone!