Визуализация отформатированного текста в приложении Direct3D - PullRequest
1 голос
/ 19 июля 2009

Мне нужно визуализировать некоторый форматированный текст (цвета, шрифты разных размеров, подчеркивание, жирный шрифт и т. Д.), Однако я не уверен, как это сделать. D3DXFont позволяет отображать только текст одного шрифта / размера / веса / цвета / и т. Д. Одновременно, и я не вижу практического способа «объединить» несколько вызовов в ID3DXFont :: DrawText, чтобы делать такие вещи ...

Я огляделся, и, кажется, нет никаких существующих библиотек, которые бы делали это, но я понятия не имею, как реализовать такой текстовый рендер, и я даже не смог найти никакой документации о том, как такой текст рендерится. будет работать, только рендеринг простой фиксированной ширины, растровые шрифты ASCII, которые, глядя на это, вероятно, являются совершенно другим подходом, который подходит только для рендеринга простых блоков текста, где Unicode не важен.

Если нет средств визуализации шрифтов direct3d, способных сделать это, есть ли другие средства визуализации (например, для использования при отображении форматированного текста в обычном окне), и они будут отображать их в текстуру в ОЗУ, а затем загружать их на видеокарту для рендеринга в задний буфер дают разумную производительность?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2010

В случае использования Direct3D9 или более ранних версий у вас действительно большие проблемы: 1. Вы всегда можете использовать GDI, визуализировать свой текст в HDC, скопировать его в динамическую текстуру Direct3D и использовать шейдер для замены фона на прозрачность, например, с помощью цветовой клавиши. 2. Взгляните на библиотеку FreeType , возможно, вы найдете ее более подходящей для вас, чем GDI, но на самом деле это будет нелегко.

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


Но если вам не нужна поддержка Windows XP, вы можете попробовать использовать Direct2D с DirectWrite и DirectX10 (я не пробовал 11). Я попробовал их, и они показали хорошие результаты, вам только следует избегать частого переключения между контекстами Direct2D и Direct3D, потому что это может серьезно ухудшить производительность. Чтобы сделать что-то для вашей текстуры, вы можете использовать функцию ID2D1Factory :: CreateDxgiSurfaceRenderTarget

3 голосов
/ 20 июля 2009

Вы пометили это с помощью Direct3D, поэтому я предполагаю, что это целевая среда. В противном случае GDI может справиться со всем этим.

На самом деле, рассмотрение GDI - хорошее место для начала, так как оно поддерживает это в том виде, в каком оно есть. В GDI для рисования текста одновременно выбран только один шрифт. Аналогичным образом, одновременно может быть выбран только один цвет текста. Итак, чтобы нарисовать строку текста, содержащую символы в нескольких цветах и ​​/ или шрифтах, вы должны разделить строку на куски символов, которые имеют одинаковое состояние рендеринга. Вы устанавливаете состояние для этого чанка (цвет текста переднего плана / фона, шрифт текста, межстрочный интервал и т. Д.), Затем вызываете ::TextOut для этого чанка текста, затем устанавливаете состояние для следующего чанка и рисуете его, и так на.

Тот же принцип применяется в Direct3D. Каждый фрагмент текста может требовать своего собственного ID3DXFont (или вашего собственного механизма шрифтов, если ID3DXFont недостаточно) и цвета и т. Д. Вы устанавливаете состояние, рисуете текст, устанавливаете состояние, рисуете текст и т. Д.

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

В Windows 7 (заполненной для Vista после поставки Windows 7) вы сможете использовать DirectWrite для высококачественной типографии в контексте визуализации Direct3D (D3D10 и более поздние версии).

0 голосов
/ 21 июля 2009

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

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