Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Вывод текста с Direct3D   Найти похожие ветки 

 
Orc   (2003-09-10 08:52) [0]

Привет Мастерам!

А как можно сделать вывод текста при использовании Direct3D? Вроде есть такие функции, как DrawTextA и DrawTextW? Не подскажите, как быть? Заранее спасибо!


 
NailMan ©   (2003-09-10 10:01) [1]

Это все отстой полный.

Для вывода девелоперской инфы можно юзать ID3DXFont, но для интерфейса необходимо писать свои фонты.

Лучше всего сделать несколько спецтекстур шрифтов(или взять из какой-нить другой игры) и написать свой класс шрифтов. Далее либо юзать стандартный ID3DXSprite для вывода букв либо сделать по взрослому и сделать через единый вертексный буфер.

Я не так давно переделал у себя все шрифты на взрослую систему и производительность на выводе текста подросла.

Суть метода такая:

- создается вертексный буфер со следующими параметрами:

Vertex = packed record
X,Y,Z : Single;
  RHW : Single;
Color : DWORD;
  U,V : Single;
end;
FVF = D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_TEX;

Размер буфера: 6 * sizeof(Vertex) * 256
последнее число это будет ограничение на длину строки в 256 символов, первое число это число вершин на букву - 2 треугольника в режиме TRIANGLELIST.

Зачем нужно именно TRIANGLELIST, а не скажем STRIP?
Нужно это для того чтобы рендерить всю строку за один вызов DrawPrimitive, что и дает прирост скорости нежели через ID3DXSprite, который выводит каждую букву за отдельный вызов DrawPrimitive(для юзверя это прозрачно).


Далее все просто: делаем классу фонта метод DrawText, которому передаем следующие параметры: сама строка, рект или координаты окна где будет выводиться строка(я юзаю рект, так как в нем легко выравнивать текст и обрезать его), цвет, флаги. Флаги здесь можно и не делать, но  тогда будет не полнофункционально. С помощью флага можно задавать тип выравнивания в ректе и т.д.

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

Ну а далее устанавливаем вертексный буфер, стейты блендинга(или стейтблок) и рендерим всю строку вызовом:
Dev.DrawPrimitive(D3DPT_TRIANGLELIST,0,2 * length(s));

Важно!!! устанавливать шрифтовый вертексный буфер с помощью SetStreamSource и SetVertexShader нужно именно после лока/анлока, иначе сильно теряется скорость, потому что когда устанавливаешь буфер, он подгружается в вершинный кэш видюхи и если его в это  момент изменять, он выгрузится/изменится/загрузится, то  довольно долгая операция.


 
MeF88 ©   (2003-09-10 10:43) [2]

2NailMan: А как насчет юзания C3DFont из библиотек от DirectX SDK? Вроде пристойный результат получается. Даже 2д, 3д, скалированные, кривые, жирные. Правда там нет поддержки для кирилицы - но сделать её можно минуты за 3.


 
NailMan ©   (2003-09-10 11:12) [3]

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

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


 
Orc   (2003-09-10 13:43) [4]

Спасибо, сёдня вечерком попробую, завтра нипишу о результатах :)


 
Sapersky ©   (2003-09-11 00:08) [5]

если юзать SDK-шный вариант надо будет его либо в дельфу транслировать

В заголовках от Clootie должен быть уже транслированный.

А вообще, если нужно выводить относительно немного текста (action-игра), можно сделать так: для цифр делается текстура как обычно, а вместо букв в текстуру прописываются целые слова или фразы (ну там "жизнь", "фраги", "вы убиты"). Полигонов на вывод текста   потребуется меньше.
Во всяком случае, я так делал вывод текста в DirectDraw. Там легче в том плане, что все слова/фразы можно разместить в поверхности по горизонтали, в квадратную (оптимальную) текстуру их несколько сложнее вписать.


 
NailMan ©   (2003-09-11 09:31) [6]

Sapersky ©
Ну тоже вариант, но он не гибкий и неоптимальный.

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



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
8-1070016737
X-Disa
2003-11-28 13:52
2004.04.04
Размер картинки


14-1078400558
NailMan
2004-03-04 14:42
2004.04.04
Защищенная флешка-ключ


14-1078704757
Rouse_
2004-03-08 03:12
2004.04.04
С Днем Рождения 8 Марта


8-1070401089
konstantinov
2003-12-03 00:38
2004.04.04
Запись через WaveIn


6-1075409790
Ig
2004-01-29 23:56
2004.04.04
Имя компьютера