Как рисовать стандартные примитивы с помощью Vulkan - PullRequest
0 голосов
/ 09 ноября 2019

Предоставляет ли Vulkan функциональность для рисования основных примитивов? Точка, Линия, Прямоугольник, Прямоугольник с заливкой, Прямоугольник с закругленными углами, Прямоугольник с закругленными углами, Круг, Заполненный круг и т. Д. Если это правда, что нужно сделать, чтобы нарисовать такие простые примитивы?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Vulkan не является библиотекой векторной графики. Это API для вашего GPU.

Он имеет (квадратные) точки и линии. Но размер, отличный от 1, не обязателен. И любые другие высокоуровневые функции, о которых вы можете подумать, не являются частью API, за исключением тех, которые в расширении VK_EXT_line_rasterization.

Прямоугольник может быть линейной полосой из четырех линий.

Заполненный прямоугольникэто, вероятно, два заполненных треугольника (соответственно, примитив Triangle Strip).

Закругленные углы и круги, вероятно, можно сделать, визуализируя ограничивающий прямоугольник и отбрасывая ненужные части фигуры в шейдере фрагмента. Или что-то можно сделать с помощью буфера трафарета. Или есть Compute Shader, который может делать все что угодно. В качестве альтернативы их можно эмулировать с помощью треугольников.

1 голос
/ 09 ноября 2019

В Вулкане нет таких служебных функций. Если вам нужно нарисовать определенный примитив, вам нужно предоставить вершины (и индексы) самостоятельно. Поэтому, если вы, например, хотите нарисовать круг, вам нужно вычислить вершины, используя стандартные тригонометрические функции, и предоставить их для вызовов рисования, используя буфер.

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

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

Как только вы получитенастройку буфера, опираясь на память и ваши значения, хранящиеся в этом буфере, вы можете нарисовать свой примитив, используя vkCmdDraw* команды.

...