Re[2]: Быстрая 2д графика
От: Silver_s Ниоткуда  
Дата: 14.11.09 19:54
Оценка: 21 (3)
Здравствуйте, korzhik, Вы писали:
А>>Подскажите, пожалуйста, быструю графическую 2d библиотеку, для GUI приложения WinForms.
K>direct2D?

Для начала вопрос: Можно ли в Direct3D10 нарисовать линию толщиной больше 1, не делая самодельных шейдеров?

А этот D2D тоже оказался не очень...
Линии можно рисовать только с включенным Antialias, тогда рисуется нормально но даже немного медленнее чем GDI+ (тоже с Antialias).На средненьких видеокарточках. А мощные крточки когда еще у всех юзеров появятся...

Если выключить Antialias тогда наклонные линнии(наклон 30-60 градусов) рисуются криво.
Вот это называется линия толщиной 1 пиксел и сплошной кистью (SolidBrush)





А вот это линия толщиной 1 с пунктирной кистью (Dash). Увиличил картинку вдвое для наглядности.
Они это называют Dash





Причем это даже не баги а усовершенствования. MS реализовал обобщенный алгоритм — теперь не толко координаты точек могут быть дробные, но и толщина линий тоже.
Вот на картинке две прямые с одинаковым наклоном. Одна толщиной 1.0, вторая 1.5 (обе со сплошной кистью)
Если бы был Antialias выглядело бы примерно как в 1.5 раза одна толще другой.
А без сглаживания, дисплей не показывает дробные пикселы, но находчивые парни из Microsoft вот что придумали:
Отдельные куски толщиной 2, другие 1, а в среднем получается 1.5.


Если сделать толщину 1.1 то эти утолщения будут в 10 раз короче (и в среднем толщина 1.1).


Линия (0,0);(506,500) шириной 1,должна иметь 6 ступенек. И они добавляют в местах стыков утолщения чтобы средняя толщина оказалась 1. Т.к. диагональные линии действительно выглядят немного тоньше (при том же числе пикселей длина больше).
Теоретически чтобы от этих утолщений избавится нужно в зависимости от наклона поправки вносить. Например толщину 0.71. Но все равно глюки будут — в одних ступеньках разрывы будут в других короткие утолщения.

.... По идее можно было бы для линий толщиной 1, использовать Direct3D10 , он линии рисовать умеет. Запросить у Direct3D буфер создать в D2D DXGIRenderTarget. Но вот проблема часто комбинировать графику — так чтобы одна линия через Direct3D10, другая через D2D. Проблема в том что D2D долго выполняет BeginDraw...EndDraw, если 10000 раз сделать(даже ничего не рисуя) то всего один фрейм в секунду получишь. Так что получится только если один слой через D3D10, другой слой поверх него через D2D или наоборот. Подходит когда неважно в каком порядке объекты рисуются. Ну от силы несколько десятков раз можно переключиться.
Разве что DirectWrite можно нормально использовать. Поверх текста уже практически никогда не рисуют.

P.S. Просто нет слов, с каким упорством MS выпускает кривые графические библиотеки. Что ни сделают либо тормозит либо криво или размыто.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.