Как рисовать текст в DirectX 12?

Это дополнительный вопрос о Как вы рисуете текст в DirectX 11. ?

В Direct3D-12 все стало намного сложнее, и, поскольку он новый, я не смог найти подходящих библиотек в Интернете.

Я создаю базовое приложение Direct3D12 FPS Test, и мне нравится отображать данные FPS на экране с моим визуализированным изображением.


person ngub05    schedule 04.04.2016    source источник


Ответы (4)


Общий ответ на подобные вопросы: «Если вам нужно спросить, то вам, вероятно, следует использовать DirectX 11». DirectX 12 — это API-интерфейс эксперта по графике, который обеспечивает огромный контроль и не особенно заботится о простоте использования для новичков. См. эту тему для побольше мыслей в этом духе.

С учетом этого одним из вариантов является использование взаимодействия устройств и Direct2D/DirectWrite. См. раздел Работа с Direct3D 11, Direct3D 10 и Direct2D. .

ОБНОВЛЕНИЕ: теперь доступен Набор инструментов DirectX для DirectX 12. Он включает в себя реализацию SpriteFont/SpriteBatch, которая будет рисовать текст на мишенях рендеринга Direct3D 12. См. это руководство.

person Chuck Walbourn    schedule 04.04.2016

Чистый DirectX 12, тогда вам нужно загрузить данные глифа шрифта в буфер вершин и выполнить рендеринг с помощью вершинного шейдера и пиксельного шейдера. Вы упомянули онлайн-библиотеки, это экспертный материал, и, к счастью, Джеймс Стэнард из Microsoft выпустил руководство с их проектом MiniEngine с открытым исходным кодом. Он обрабатывает несколько шрифтов, сглаживание и тени в DirectX 12.

Найдите файлы проекта на GitHub https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/MiniEngine и проверьте Textrender.h и Textrender.cpp.

person Chris    schedule 14.06.2016

Если вам нужен максимальный набор функций при минимальной работе, вам, вероятно, следует использовать DirectWrite поверх устройства взаимодействия D3D11, как сказал Чак в своем ответе.

Если вы хотите запустить собственный высокопроизводительный рендеринг текста, вы можете взглянуть на текстовый рендерер в репозитории примеров miniengine на github, у него есть несколько интересных идей.

person Zarat    schedule 13.05.2016

К сожалению, единственные способы уже были описаны. Взаимодействуйте с DirectWrite или создайте свою файловую систему глифов.

Что вы делаете, так это импортируете файл текстуры с глифами на нем, вырезаете маленькие квадраты вокруг каждого символа из файла текстуры глифа, а затем склеиваете все это вместе, чтобы сформировать строку. Это приводит к более быстрому рисованию (в некоторых случаях).

Я думаю, что подход к этому, на который ссылаются другие, немного устарел и обречен на провал. Direct3D11 имел такое же отсутствие поддержки рисования текста, как и Direct3D12 (возможно, дезинформация по этому поводу). Это был Direct3D9, который имел встроенную поддержку отрисовки текста, которая, тем не менее, работала нормально, а позже поддерживала пакетную отрисовку спрайтов, где вы могли отображать весь текст в одном спрайте.

Кажется обратным утверждение, что вам просто «нужно знать» или «не являетесь экспертом», чтобы внедрить такую ​​простую, но утомительную систему. Такой системе суждено потерпеть неудачу, точно так же, как никто не хочет использовать Ассемблер для кодирования чего-то, что они могут кодировать на C и далее.

Математические библиотеки D3D11 и D3D12 также страдают теми же сбоями. Для определения и преобразования векторов вам лучше использовать математику D3D9X или пользовательские математические структуры, потому что новые включенные методы настолько обратны. «Кто-то» сделал это, и это должно понравиться, но я помню, как жаловался, показывая, насколько легко выполнять векторные операции до и после, это почти удваивает или утраивает количество строк, необходимых для выполнения основных операций и преобразований векторов, даже не считая количество ссылок и время обучения, которое вам потребуется, чтобы увидеть, как работает чужая библиотека. Кажется, это большой провал, представленный математиками, которые никогда не были хороши в программировании.

person Community    schedule 14.07.2017