Примитивы - SIISII/DirectX GitHub Wiki

Direct3D обрабатывает геометрию в виде трёх типов базовых примитивов — точек, отрезков и треугольников. Эти примитивы определяются соответственно одной, двумя или тремя вершинами каждый, находящимися в списке вершин. Сам список вершин формируется стадией сбора исходных данных на основе содержимого привязанных к ней вершинного и индексного буферов: в вершинном буфере содержатся характеристики (в частности, координаты) вершин, а индексный буфер определяет порядок их выборки из вершинного буфера; если индексный буфер отсутствует, вершины выбираются в порядке их следования в вершинном буфере.

Формирование примитивов из списка вершин производится в соответствии с типом топологии, установленным для стадии сбора исходных данных. Имеются следующие типы топологии, определённые в перечислении D3D_PRIMITIVE_TOPOLOGY (для Direct3D10 это перечисление называется D3D10_PRIMITIVE_TOPOLOGY; определяемые в нём константы имеют префикс D3D10_ вместо D3D_):

  • D3D_PRIMITIVE_TOPOLOGY_UNDEFINED — топология не определена, рендеринг невозможен.

  • D3D_PRIMITIVE_TOPOLOGY_POINTLIST — список вершин задаёт набор точек (каждая вершина соответствует одной точке).

  • D3D_PRIMITIVE_TOPOLOGY_LINELIST — список вершин задаёт набор отрезков (две подряд следующие вершины определяют один отрезок).

  • D3D_PRIMITIVE_TOPOLOGY_LINESTRIP — список вершин задаёт полосу отрезков (две подряд следующие вершины определяют один отрезок, причём конец одного отрезка является началом следующего; таким образом, весь список определяет ломаную линию).

  • D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST — список вершин задаёт набор треугольников (три подряд следующие вершины определяют один треугольник).

  • D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP — список вершин задаёт полосу треугольников (три подряд следующие вершины определяют один треугольник, причём две последние вершины одного треугольника являются двумя первыми вершинами следующего треугольника).

  • D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ — список вершин задаёт набор отрезков со смежными вершинами (для каждого отрезка, помимо двух вершин, определяющих его концы, заданы также две вершины, смежные с концами). Этот и последующие типы топологии используются геометрическим шейдером; вершинный шейдер не видит разницы между вершинами.

  • D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ — список вершин задаёт полосу отрезков со смежными вершинами.

  • D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ — список вершин задаёт набор треугольников с вершинами, смежными их сторонам.

  • D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ — список вершин задаёт полосу треугольников с вершинами, смежными их сторонам.

Прочие варианты, определённые в данном перечислении, относятся к тесселяции; здесь они не рассматриваются.

Описанные варианты топологии представлены на следующем рисунке; цифры на нём указывают номера соответствующих вершин в списке.

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

Если используется индексный буфер, то можно определить несколько несвязанных полос отрезков или треугольников в одном вершинном буфере. Для этого несвязанные отрезки разделяются индексом, имеющим значение —1. Заметим, что эта возможность требует аппаратной поддержки уровня DirectX 10, более ранние графические процессоры могут не иметь такой возможности.

Разорвать полосу и начать новую можно и в шейдере, используя функцию RestartStrip.