Толщина Строки Direct3D

Как я изменяю толщину строк при рисовании списков строки с помощью Direct3D?

В этом сообщении говорится, что ширина строки не поддерживается и продолжает обеспечивать обходное решение.Другие опции?

В то время как мы находимся по этой теме, программы построения теней позволяют проводить линии с пунктирными узорами?

14
задан Stringer 18 February 2010 в 17:08
поделиться

3 ответа

Вы можете использовать геометрический шейдер, который будет принимать на вход сегмент вашей линии и выводить квад (треугольную полосу из двух треугольников) так, чтобы ширина квада была постоянной в пространстве экрана и соответствовала желаемой толщине линии. Это прекрасно работает (поскольку я реализовал это в 3D-движке CAD).

Если геометрический шейдер не подходит, обходным решением может быть использование вершинного шейдера, но это потребует некоторой переработки вашего VB. Имейте в виду, что VS должен иметь знания о сегменте линии в целом, поэтому в итоге вы будете хранить p и p+1 для каждого элемента VB, плюс затраты на дублирование индексов/вершин (в зависимости от используемой топологии и того, рендерите ли вы линию как индексированный примитив или нет).

Если производительность не является проблемой, то расширение на CPU, возможно, будет правильным решением.

EDIT:

О штриховых узорах: вы можете использовать геометрический шейдер, чтобы эмулировать поведение glLineStipple. Если у вас топология GL_LINES, то есть изолированные линии, узор перезапускается на каждом новом отрезке линии. Поэтому в шейдере геометрии нужно просто вычислить горизонтальное начало (или вертикальное начало, в зависимости от ориентации) сегмента линии в пространстве экрана и передать эту дополнительную информацию пиксельному шейдеру. Затем пиксельный шейдер будет отвечать за отбрасывание фрагментов в соответствии со значениями factor и pattern (инструкции DirectX 10/11 Integer и Bitwise облегчают эту задачу).

Это снова работает хорошо, и вы можете комбинировать это с эмулированными линиями ширины (с помощью первой техники, упомянутой выше).

Теперь, если у вас топология GL_LINE_STRIP, шаблон перезапускается при каждом новом примитиве (то есть при каждом новом вызове рисования). Ситуация становится немного сложнее, поскольку вам нужно знать количество пикселей, которые были отрисованы ранее, и это для каждого сегмента линии.

Этого можно достичь, если рендерить полосу линий во временном VB, используя функциональность DirectX 10 stream-out (каждый элемент этого VB соответствует длине экранного пространства каждого сегмента). Затем нужно выполнить Parallel Prefix Sum (aka Scan) этого VB (для накопления значений длины каждого сегмента линии).

Наконец, вы рендерите полосу линий, как для GL_LINES, но используете эту дополнительную информацию Scan VB в PS.

16
ответ дан 1 December 2019 в 08:16
поделиться

Не знаю. Я хотел бы использовать простое и свободное хранилище ключей, которое я могу вызвать в процессе, но такой вещи не существует на платформе Windows. Сейчас я использую Sqlite, но я хотел бы использовать что-то вроде токийского кабинета. У BerkeleyDB есть лицензионные «проблемы».

Однако, если вы хотите использовать ОС Windows, выбор баз данных NoSQL ограничен. И не всегда есть поставщик C #

я пробовал MongoDB, и он был в 40 раз быстрее, чем Sqlite, так что, возможно, мне стоит использовать его. Но я все еще надеюсь на простое в процессе решение.

-121--622702-

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

Передача сообщений является правильным способом поддержки параллелизма, не позволяя проблемам параллелизма полностью выйти из-под контроля. Правильно организуйте передачу сообщений, и у вас должно быть столько же мощности, сколько и при совместном использовании состояния. Тебе действительно не нужна альтернатива, которую ты думаешь.

-121--3272217-

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

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

Поэтому, вероятно, нет никакого способа создать экструдированные квадраты для этой цели. Есть несколько способов добиться этого, как объяснил Стрингер Белл в своем ответе.

Самый простой способ, который работает для меня - создать буфер вершин, который содержит каждую вершину дважды, с нормалями, указывающими «вправо» или «влево»,в зависимости от того, являются ли они правым или левым краем линии. Затем очень простой вершинный шейдер может выполнить выдавливание (изменив положение вершины на кратное ее нормальному вектору). Таким образом можно быстро изменить ширину линии без необходимости пересчитывать геометрию на CPU. Это может быть полезно, если требуется скорректировать ширину линии в зависимости от размера или расстояния объекта.

15
ответ дан 1 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: