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