Рендеринг произвольного текста в XNA с использованием Windows API?

9

В комментарии Эндрю на мой другой вопрос он отметил, что можно отображать текст на Texture2D с помощью Windows API вместо рисования текста непосредственно с помощью SpriteBatch. Как это сделать? Я предполагаю, что есть промежуточный шаг перед записью данных изображения в Texture2D.

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

ThatsGobbles
источник

Ответы:

4

Используя некоторое отражение, вы можете получить указатель поверхности Direct3D из Texture2D. Оттуда вы можете использовать любые API, которые могут отображать на поверхность DX. Я сделал это недавно для размещения контента XNA с WPF D3DImage (с поддержкой альфа-канала). DirectWrite может выполнять рендеринг на поверхность DX, и вы можете даже использовать управляемые API . Оболочки DirectX .NET в этой ссылке поддерживают только Direct3D 10 и 11, но не Direct3D 9 (в XNA используется AFAIK). Тем не менее, вы все еще можете заставить его работать. Кстати, если вы хотите визуализировать векторную графику, вы можете использовать аналогичный подход для взаимодействия с Direct2D. Естественно, ничего из этого не будет работать на любой поддерживаемой XNA платформе, кроме Windows.

Майк Штробель
источник
1
Я просто хочу отметить, что вы также можете получить дескриптор окна для xna и сказать ему, чтобы он отображал что-то вроде панели win32. Затем вы можете использовать любой метод рендеринга в верхней части игры, поскольку вы просто рисуете буферный буфер в элемент управления win32. Это очень грязно, но хорошо сработало, когда я слил панель ввода планшетного ПК с XNA. Результатом стало то, что казалось стандартным окном XNA, но с невидимым распознаванием почерка. Я просто отображал штрихи поверх xna. Конечно, текст / метки / кнопки тоже будут работать. Однако я не пробовал это с WPF.
Зфедоран
1
Я думаю, что с вашим методом возникнут проблемы с «воздушным пространством», Арриу. Удалось ли визуализировать содержимое поверх окна XNA с неповрежденным альфа-каналом? Общее правило заключается в том, что пиксель может «принадлежать» только одному графическому API, что вызывает проблемы с прозрачным или полупрозрачным содержимым. Если это относится и к вашему методу, то было бы проблематично отображать текст поверх чего-либо, кроме однотонного фона.
Майк Штробель
Извините, возможно, я немного запутался. Метод, который я описал, просто говорит панели рисовать текстуру на ее фоне. Аналогично тому, как вы можете указать изображению, какое изображение рисовать. Но вместо того, чтобы текстура / изображение были файлом, это буфер XNA. Я не рисовал поверх или над панелью / окном. Так что с "воздушным пространством" проблем не было.
Зфедоран
Ах я вижу. Таким образом, ваш подход очень похож на то, как я размещал контент XNA в WPF (используя D3DImage). Вместо типичного источника растрового изображения источником изображения является поверхность XNA / Direct3D. Я согласен, что это лучший подход, учитывая имеющиеся варианты - нет проблем с воздушным пространством, и производительность довольно хорошая, потому что не нужно никакого ненужного копирования / блинтинга.
Майк Штробель