Direct3D: каркас без диагоналей - PullRequest
1 голос
/ 06 ноября 2008

При использовании режима заливки каркаса в Direct3D все прямоугольные грани отображают диагональную линию, потому что грань разбита на два треугольника. Как мне устранить эту строку? Я также хочу удалить скрытые поверхности. Режим каркаса не делает этого.

Мне нужно отобразить модель Direct3D в изометрическом виде каркаса. Отрисованная сцена должна отображать границы граней модели, но должна исключать диагонали.

Ответы [ 3 ]

2 голосов
/ 06 ноября 2008

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

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

1 голос
/ 06 ноября 2008

Встроенный каркасный режим визуализирует края примитивов. Так как в D3D примитивы являются треугольниками (или линиями, или точками - но не произвольными многоугольниками), это означает, что встроенный способ не разрезает его.

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

В качестве альтернативы, вы можете создать список строк, который имеет только те ребра, которые вам нужны, и просто отобразить их.

Еще одной альтернативой может быть использование геометрических шейдеров в Direct3D 10. Здесь много разных вариантов.

0 голосов
/ 06 ноября 2008

Я думаю, вам нужно будет нарисовать эту линию вручную, поскольку режим каркаса является встроенным, поэтому я не думаю, что вы можете изменить это. Вы можете получить список вершин в вашей сетке и обработать их в список линий, которые вам нужно нарисовать.

...