» 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

~4d ago

~8d ago

joreg: The Winter Season of vvvv workshops is now over but all recordings are still available for purchase: https://thenodeinstitute.org/ws23-vvvv-intermediates/

~14d ago

schlonzo: Love the new drag and drop functionality for links in latest previews!

~22d ago

joreg: Workshop on 29 02: Create Sequencers and Precise Clock Based Tools. Signup here: https://thenodeinstitute.org/courses/ws23-vvvv-08-create-sequencers-and-precise-clock-based-tools-in-vvvv-gamma/

~29d ago

joreg: Workshop on 22 02: Unlocking Shader Artistry: A Journey through ‘The Book of Shaders’ with FUSE. Signup here: https://thenodeinstitute.org/courses/ws23-vvvv-12-book-of-shaders/

~1mth ago

joreg: Talk and Workshop on February 15 & 16 in Frankfurt: https://visualprogramming.net/blog/vvvv-at-node-code-frankfurt/

~1mth ago

woei: @Joanie_AntiVJ: think so, looks doable

~1mth ago

xd_nitro: Anyone remember who increased projector brightness by removing some components that product the color?

~1mth ago

Joanie_AntiVJ: This looks super interesting (vectors over network) would anyone here know how to implement this in beta? https://github.com/madmappersoftware/Ponk