Расширенный рендеринг текста с Direct3D - PullRequest
0 голосов
/ 21 июня 2010

Позвольте мне описать «поле битвы» моей задачи:

  • Многокомнатный аудио / видео чат с более чем 1 млн. Пользователей;
  • Настраиваемый рендерер Direct3D;

Мне нужно реализовать функцию TextOverVideo.Сам текст проходит через сеть и должен быть представлен на стороне получателя с помощью Direct3D рендерера.AFAIK, он обычно используется в разработке игр, чтобы создать собственную текстуру с буквами / цифрами и нарисовать эти предметы.Поскольку наше приложение должно поддерживать множество языков, мы должны использовать стандарт.Вот почему я работал с интерфейсом ID3DXFont, но обнаружил некоторые неудовлетворенные ограничения.

С чем я столкнулся, так это с недостаточной масштабируемостью.Например, если пользователь изменяет размер окна видео, я должен заново создать D3DXFont с новым D3DXFONT_DESC, пока он это делает.Я думаю, что это недопустимо.Вот почему ЕДИНСТВЕННОЕ решение, которое я вижу (благодаря моим навыкам), каким-то образом отображает текст в текстуру и поэтому рисует спрайт с масштабированием, переводом и т. Д.

Итак, я не уверен, что я зайду вправильное направление.Пожалуйста, помогите советом, опытом, литературой, источниками ...

Ответы [ 2 ]

3 голосов
/ 21 июня 2010

Ваш вопрос немного неясен. Насколько я понимаю, вам нужен легко масштабируемый шрифт.

Я думаю, что это неприемлемо

Насколько я знаю, это стандартное поведение для шрифтов - даже для системных шрифтов. Они не должны быть легко масштабируемыми.

Возможные решения:

  1. Используйте ID3DXRenderTarget для рендеринга текста на текстуру. Шрифт будет отфильтрован, когда вы увеличите его слишком много. Некоторые люди подумают, что это выглядит ужасно.
  2. Написать пользовательскую библиотеку, которая поддерживает векторные шрифты. То есть - он должен быть в состоянии извлечь контур шрифта из шрифта и построить текст из него. Это будет НАМНОГО медленнее, чем ID3DXFont (который уже медленнее, чем традиционные «текстурные» шрифты). Текст будет легко масштабироваться. Используя этот способ, вы, скорее всего, получите видимые артефакты («шум») для мелкого текста. Я бы не использовал этот подход, если вы не хотите огромные буквы (более 40 пикселей). Библиотека Freetype может иметь функции для обработки контуров шрифтов.
  3. Или вы можете попробовать использовать D3DXCreateText. Это создаст 3D текст для ОДНОЙ строки. Не будет быстро вообще.

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

- EDIT -

Об ID3DXRenderTarget.
Даже если вы используете ID3DXRenderTarget, вам понадобится ID3DXFont. То есть вы используете ID3DXFont для рендеринга текста на текстуру, а затем с помощью текстуры перетаскиваете текст на экран.
Поскольку вы сказали, что производительность критична, вы можете отложить создание нового ID3DXFont до тех пор, пока пользователь не перестанет изменять размер видео. То есть Когда пользователь начинает изменять размер видео, вы используете старый шрифт, но увеличиваете его, используя текстуру. Там будет фильтрация, конечно. Когда пользователь перестает изменять размер, вы создаете новый шрифт, когда у вас есть время. Вы, вероятно, можете сделать это в отдельной ветке, но я не уверен в этом. ИЛИ вы всегда можете просто визуализировать текст в том же разрешении, что и видео. Таким образом, вам не придется беспокоиться об изменении его размера (он все равно будет отфильтрован вместе с видео). Некоторые видеоплееры работают таким образом.
Еще немного о ID3DXFont. Есть одна проблема с ID3DXFont - она ​​медленная в ситуациях, когда вам нужно много текста (но он вам все еще нужен, потому что он поддерживает юникод, а написание текстуры с поддержкой юникода - боль). В прошлый раз, когда я работал с ним, я оптимизировал вещи, кэшируя часто используемые строки в текстурах. То есть любая строка, которая была нарисована более чем в 3 кадрах в строке, визуализировалась в цель текстуры / рендера D3DFMT_A8R8G8B8, а затем я копировал эту строку из текстуры вместо использования ID3DXFont. Строки, которые не отображались некоторое время, были удалены из текстуры. Это дало серьезный импульс. Это решение, однако, является хитрым - мониторинг пустого пространства в текстуре, удаление неиспользуемых строк и дефрагментация текстуры не совсем тривиальны (в этом нет ничего особенно сложного, но легко ошибиться). Вам не понадобится такая сложная система, если ваш экран буквально не покрыт текстом.

0 голосов
/ 28 ноября 2012

ID3DXFont шрифты плоские, всегда параллельные экрану. D3DXCreateText - это сетки, которые можно масштабировать и поворачивать.

Текстурные шрифты размыты и выглядят не очень четкоНе подходит для приложения, которое использует много мелкого текста.

Я пишу приложение, которое может создавать 500 текстовых сеток, каждая сетка в среднем 3000-5000 вершин.Текстовые сетки создаются один раз, затем статичны.Я получаю 700 кадров в секунду на GeForce 8800.

...