Форум: "Игры";
Текущий архив: 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