Текущий архив: 2004.11.14;
Скачать: CL | DM;
ВнизШрифт Найти похожие ветки
← →
Evgeniy_K (2004-07-21 20:04) [0]У меня есть 4 битовая картинка - матрица букв. Я хочу ее использовать для составления слов, чтобы эффективней было, как лучше сделать? Попиксельно альфаканал накладывать - имхо, не оптимально. Есть ли другой вариант? Direct Draw - JEDI
← →
cyborg © (2004-07-21 20:09) [1]Не понятно.
Шрифт - обыкновенная поверхность с цветовым ключём. Каждую букву выводишь на другую поверхность.
← →
Evgeniy_K (2004-07-21 20:24) [2]Шрифт представляет собой четырехбитовую картинку. Чем ярче пиксель, тем выше прозрачность. Т.е. картинка-маска задает альфа канал.
Как работает:
Я выбираю цвет. И потом нужно цветом вывести шрифт, шрифт выводится ч/з маску. Например, черный пиксель - выбранный цвет. Чем светлее пиксель, тем выше его прозрачность, т.е. у меня будет шрифт не монотонный, а с переходами. Где белый цвет - там прозрачные места. Так понятно?
← →
cyborg © (2004-07-21 20:29) [3]Думаю, что такой шрифт будет тормозить игру.
← →
Evgeniy_K (2004-07-21 20:39) [4]тема закрыта
← →
Evgeniy_K (2004-07-21 20:40) [5]не будет, ибо рендерится он будет при загрузке, а потом хранится в памяти.
← →
OSokin (2004-07-21 20:59) [6]Не понял... У меня было куда все проще... Я просто брал байт или два, расписывал их побитно, брал каждый бит поотдельности, смотрел: 1 - inverted, 0 - transparent...
← →
Белый Крыс © (2004-07-21 22:25) [7]2 Evgeniy_K
Куда рендериться???
Когда будет происходить вывод шрифта на экран, результируемый цвет пикселя должен просчитываться, используя текущий цвет пиксела и уровень прозрачности (альфы). Понятное дело, это будет происходить каждый кадр.
← →
ПсихЪ_задумчивый (2004-07-22 10:22) [8]
> Белый Крыс © (21.07.04 22:25) [7]
Лучше для каждой строки или всей текстовой области делать отдельную поверхность. Цвет букв задавать следующим образом.
1.1 Буквы - белые на чёрном фоне (белый - колоркей)
1.2 Поверхность для нанесения текста (колоркей - цвет фона букв, чёрный)
2. Выбираем цвет букв - зелёный
3. Закрашиваем поверхность для нанесения текста зелёным цветом
4. Наносим (блитим, отрисовываем) на эту поверхность буквы с флагом колоркея
5. Получаем зелёные буквы на чёрном фоне
6. Рисуем поверхность куда следует с флагом колоркея
7. Получаем зелёные буквы на нужном вам фоне
8.1 Если текст неизменен - повторяем 6
8.2 Иначе - 2
← →
Белый Крыс © (2004-07-22 14:18) [9]2 ПсихЪ_задумчивый
:) Спасибо. Но вот только первая строчка должна быть не
> Белый Крыс © (21.07.04 22:25) [7],
а Evgeniy_K.
Но, я сказал - уровень прозрачности. Т.е. в данном случаем твой способ не подойдет. Потому что требования другие. Нужен не прозрачный фон, а прозрачные буквы. Т.е. сквозь текст просматривался, скажем там, инвентарь. Что касается DirectDraw. То тут можно использовать не BitMap fonts, а обычные. Рисовать WinAPI"вской функцией.
← →
ПсихЪ_задумчивый (2004-07-22 14:48) [10]
> Белый Крыс © (22.07.04 14:18) [9]
Если ты ещё раз внимательно прочтёшь всё, что я написал и разберёшь каждый пункт, и тех, которые я написал, то явственно увидишь, что:
1. На БэкБуффер выводятся буквы выбранного в пункте 2 цвета с прозрачным цветом.
2. Градиентной прозрачности, затухающих краёв и ново-хитрых альфа-каналов нет для максимального быстродействия (используется исключительно игра цветовыми ключами).
← →
Белый Крыс © (2004-07-22 15:32) [11]2 ПсихЪ_задумчивый
(((((((;
Если ты ещё раз внимательно прочтёшь всё, что я написал и разберёшь это, то ты увидешь, что я говорю именно про затухающих краёв, полупрозрачность самих и букв и т.д.
:))
Я прекрасно понял твои слова, потому и говорю что в данном случае с учетом требований о "полупрозрачности и т.д." этот способ не подходит.
Интересно, что будет быстрее, твой способ или вот это
procedure DrawText2(const surf : IDirectDrawSurface7; hFont : HFONT; strText : PCHAR; OX, OY : DWORD; crForeground : COLORREF);
var
DC : HDC;
hr : HRESULT;
begin
DC := 0;
if( ( surf = nil ) or ( strText = nil ) ) then Exit;
hr := surf._Restore;
if( FAILED( hr ) ) then Exit;
hr := surf.GetDC( DC );
if( FAILED( hr ) ) then Exit;
SetBkMode(DC, TRANSPARENT); /// Обрати внимание
SetTextColor( DC, crForeground );
if( hFont <> 0 ) then SelectObject( DC, hFont );
TextOut( DC, OX, OY, strText, length(strText) );
hr := surf.ReleaseDC( DC );
if( FAILED( hr ) ) then Exit;
end;
??
← →
ПсихЪ_задумчивый (2004-07-22 16:36) [12]
> Белый Крыс © (22.07.04 15:32) [11]
Мой способ будет быстрее и обладать большими возможностями, ибо позволит использовать нарисованные заранее формы шрифтов. Нарисованные так, как нужно разработчику, а не так, как отрендерит пользовательская винда.
В задании сказано, что нужно просто заранее выводить с антиалиасингом битмэпнутые шрифты. Но в четыре байта данные о полупрозрачности не воткнёшь, и автор не хочет юзать попиксельную прорисовку...
← →
Белый Крыс © (2004-07-22 17:14) [13]>нарисованные заранее формы шрифтов
Это как? Какие формы. Ну я тоже могу любые шрифты и "формы" использовать :).
>так, как отрендерит пользовательская винда.
Не хочу удивить сильно, но она отрисует текст "так, как нужно разработчику". Я этому не удивлен и проблем с этим не встречал.
А вот ЧТО сказано в задании:
Чем ярче пиксель, тем выше прозрачность. [2] Так более того, эти 4 байта и ЕСТЬ данные о прозрачности. Т.е. именно рисуется буква, которая (именно сама буква, а не фон) полупрозрачна. Как сказано в том же 2 посте, там где белый - там прозрачно, черный - непрозрачно, а градации серого - уровни прозрачности, чем светлее, тем прозрачнее(по-крайней мере так написано).
Потому и задан был вопрос. Ведь как сделать ключевые цвета и так ясно, тем более что в принципе твой вариант автор сам же и изложил [2].
Что касается моей процедуры, это как замена твоего способа(без полупрозрачности), т.е. без bitmap шрифтов.
← →
ПсихЪ_задумчивый (2004-07-22 17:21) [14]
> Белый Крыс © (22.07.04 17:14) [13]
Дык с полупрозрачностью на DirectDraw и так ясно - она тормозная, как мой комп. (: Даже если использовать специальные функции, написанные на С++ (http://), это всё равно не помогает.
Поэтому остаётся только использование разноцветный битмэпнутых шрифтов без антиалиасинга. Вот я и предложил метод. А системные шрифты - это отстой некрасивый, подойдёт исключительно для вывода на экран отладочной инфы.
← →
ПсихЪ_задумчивый (2004-07-22 17:23) [15]Забыл ссылку дописать: http://tzlab.amillo.net/?desc=cpp/directx.htm - AlphaDLL - несколько функций отрисовки прозрачности, написана на С++, в архиве примеры использования на С++ и на Delphi. Если нужны исходники - в мыло.
← →
Белый Крыс © (2004-07-22 17:33) [16]Так бы сразу ;). Просто автор изначально указал о полупрозрачных шрифтах.
>отстой некрасивый
Те же рисованный только в профиль. :)
Почему, да потому что рисованный разве что scale"ом увеличивать, а обычные - лучше.
Потому лучше всего сразу брать отрисованный нужным цветом со всеми затенениями и эффектами шрифты и рисуютсю с колоркеем - самое быстрое и КАЧЕСТВЕННОЕ.
Твои способ не предложит букв с эффектами.
Спасибо. Ссылку не надо. Я это уже бросил.
← →
cyborg © (2004-07-22 18:09) [17]Ладно спорить, мы вчера в аське решили проблему ;), там не прозрачность нужно было ему.
← →
Evgeniy_K (2004-07-23 10:37) [18]полупрозрачность я иначе реализовал ;), а то что мне нужно здесь было, мы с киборгом уже решили :)
Страницы: 1 вся ветка
Текущий архив: 2004.11.14;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.034 c