» 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

~5h ago

joreg: Interested in #visualprogramming with #vvvv? Meetup in #berlin on the 25th: 10-berlin-vvvv-meetup Featuring @kopffarben

~22h ago

ggml: is pepperoni dmx adapter still expected to work with b38 ?

~1d ago

bo27: @sinus hi! Thanks for using the template. Run is for endusers and it kills explorer. Try developer.bat to access patches

~1d ago

sinus: @bo24: sorry for da hassle. everything´s fine again. several restarts did the job.

~1d ago

sinus: @bo24: my mail db@servus.at

~1d ago

sinus: @IvanRastr aka bo24: found your project template, tested run bat.file, now my screen is black. only cursor. what to do?

~6d ago

cznickesz: @tonfilm thanks for the info. Can´t wait to give it a try!

~7d ago

tonfilm: @cznickesz #vvvv #vl #xenko integration is not ready for the public yet, it's still under heavy development... more updates soon.

~7d ago

cznickesz: Possibly dumb question: is there any release containing xenko-integration right now?