Как нарисовать линию и шрифт без D3DX9 в DirectX 9?

Я видел, что D3DX9 не рекомендуется Microsoft и не поставляется с Windows SDK. Я хотел бы принять.

Мне не хватает утилиты для рисования линий.

Как заменить ID3DXLine и ID3DXFont в «новом» DirectX9?


person Hooch    schedule 21.12.2013    source источник
comment
Если вам не нужно 3D, альтернативой являются Direct2D и DirectWrite.   -  person Roger Rowland    schedule 22.12.2013
comment
D3DX больше не входит в Windows SDK, но почему бы не использовать последний отдельный DirectX SDK: microsoft.com/en-us/download/details.aspx?id=6812   -  person cdoubleplusgood    schedule 24.12.2013


Ответы (2)


Как правило, линии и шрифты — это спрайты. ID3DXLine и ID3DXFont используют интерфейс ID3DXSprite под капотом. (Конечно, есть и другие варианты, но спрайтовый подход используется чаще всего)

Рисование спрайтов

Итак, во-первых, вам понадобится либо сторонний, либо ваш собственный рендерер спрайтов. Как правило, разработка спрайтового движка состоит из этапов:

  • рисование связки простых цветных четырехугольников (два треугольника, образующие прямоугольник). Существуют разные методы, но даже простейший подход с использованием буфера вершин «все в одном» не так уж и плох. Более продвинутые методы включают создание экземпляров, точечные спрайты, геометрические шейдеры и приемы тесселяции (последние два не применимы в DX9). Но даже не пытайтесь рисовать миллион спрайтов с миллионом вызовов отрисовки ;)
  • Текстурирование этих четырехугольников. Вам понадобится загрузчик растровых изображений. Если вы вообще не хотите использовать D3DX, вы можете выбрать библиотеку FreeImage с открытым исходным кодом, например, или написать свой собственный загрузчик.
  • оптимизация рендеринга с помощью пакетной обработки. Сортируйте свои спрайты, чтобы свести к минимуму количество вызовов отрисовки и/или свести к минимуму изменения состояния контекста.
  • оптимизация текстурирования с помощью текстурных атласов. Вам нужно будет решить алгоритм упаковки прямоугольников (в Интернете уже есть множество реализаций, или возьмите учебник по математике) и развернуть какой-то формат текстурного атласа.

Вы можете выбрать, на каком этапе вы остановитесь. Позже вы можете вернуться и продолжить.

Линии рисования

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

Текст чертежа

Для текста все может быть очень сложно (и здесь я расскажу только о спрайтовых шрифтах):

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

Чтобы получить символы из файла шрифта, такого как .ttf, в растровое изображение (изображение), вы можете использовать библиотеку. FreeType — лучший из известных мне программ с открытым исходным кодом. Самостоятельный разбор шрифтов может быть... сложным.

Затем вы можете смешать все вместе и нарисовать линии с текстурой текста. Или нарисуйте текст, окруженный рамкой из линий. Или спрайт с текстом над ним. Или графический интерфейс. Все эти вещи будут спрайтами.

... или просто не заморачиваться

Если вы все еще используете DirectX 9, вам действительно нужно возиться с Windows SDK, удаляя вещи D3DX? Может быть, вы можете продолжить разработку с помощью Direct SDK и D3DX, если это вам подходит? Обратите внимание: если по какой-то причине вы решите перейти на DX11, есть DirectXTK, которые частично заменяет материал D3DX11. Тем не менее, ваше собственное или стороннее решение, вероятно, будет более гибким и подходящим для вас. Есть много других применений спрайтов в 3D-графике, таких как рекламные щиты, графический интерфейс, частицы и т. Д. И, как всегда, изобретать велосипед — это очень весело и позитивно;)

Надеюсь, поможет. Удачного кодирования!

person Ivan Aksamentov - Drop    schedule 22.12.2013

Почему бы не попробовать использовать DirectX 11?

В остальном OpenGL поддерживается практически на любой платформе.

Я бы порекомендовал попробовать SDL, у него есть вспомогательные методы для большинства 2D-материалов, которые вы можете себе представить.

person user2130951    schedule 21.12.2013
comment
Потому что моему приложению это не нужно. И я до сих пор не знаю, как рисовать линии в DX11. - person Hooch; 21.12.2013
comment
Вы должны попробовать SDL, у него есть необходимая поддержка, если вы хотите нарисовать линию. - person user2130951; 21.12.2013
comment
Я хочу использовать DirecX9 и рисовать линии. Я не хочу SDL, OpenGL или что-то еще. - person Hooch; 21.12.2013