Вы можете использовать геометрический шейдер, который будет принимать в качестве ввода сегмент вашей линии и выводить квад (полосу треугольника, состоящую из двух треугольников), чтобы ширина квадратов была постоянной в пространстве экрана и соответствовала линии желаний.толщина.Он отлично работает (для реализации в 3D-движке CAD).
Если геометрический шейдер не является опцией, можно обойти это путем использования вершинного шейдера, но это потребует некоторой доработки вашегоVB.Имейте в виду, что VS должен знать о линейном сегменте в целом, так что вы в конечном итоге сохраните p и p + 1 для каждого из ваших элементов VB плюс стоимость дублирования индексов / вершин (в зависимости от используемой топологии иесли вы представляете свою строку как индексированный примитив или нет).
Если производительность не является проблемой, возможно, вам нужно выполнить расширение на ЦП.
РЕДАКТИРОВАТЬ:
О шаблонах штрихов : вы также можете использовать геометрический шейдер для эмуляции поведения glLineStipple
.Если у вас топология GL_LINES
, то есть изолированные линии, шаблон перезапускается на каждом новом сегменте линии.Таким образом, вам просто нужно вычислить в геометрическом шейдере горизонтальное начало пространства экрана (или вертикальное начало, в зависимости от ориентации) сегмента линии и передать эту дополнительную информацию в пиксельный шейдер.Затем пиксельный шейдер будет отвечать за удаление фрагментов в соответствии со значениями factor и pattern (инструкции DirectX 10/11 Integer и Bitwise делают это простым).
Сноваэто работает хорошо, и вы можете комбинировать его с эмулируемыми линиями ширины (с первой вышеупомянутой техникой).
Теперь, если у вас есть топология GL_LINE_STRIP
, шаблон перезапускается при каждом новом примитиве (так для каждого нового рисованиявызов).Ситуация становится немного более сложной, поскольку вам необходимо знать количество пикселей, которые были отрисованы ранее, и это для каждого сегмента линии.
Этого можно добиться с помощью рендеринга линейного отрезка во временной области.VB с использованием функции потоковой передачи DirectX 10 (каждый элемент этого VB соответствует длине экранного пространства каждого сегмента).Затем вы должны выполнить Parallel Prefix Sum (aka Scan) этого VB (для накопления значений длины каждого сегмента линии).
Наконец, вы визуализируете линейку как для GL_LINES
, но используете этот дополнительный Scan VBинформация в ПС.