Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

Вывод текста с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.034 c
14-1078600476
Undert
2004-03-06 22:14
2004.04.04
Где можно почитать о том


9-1063986182
Still_Swamp
2003-09-19 19:43
2004.04.04
Предложите алгоритм построения фрактальной карты высот


4-1074633009
tigrix
2004-01-21 00:10
2004.04.04
FOCUS!


3-1078384596
Виктор Исмагилов
2004-03-04 10:16
2004.04.04
Ключевые слова ADO, BDE и правила


11-1059559272
Polymorphic
2003-07-30 14:01
2004.04.04
Где взять KOLMath.pas (Нужен для StrGrd)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский