Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.049 c
14-1098695957
Debugger
2004-10-25 13:19
2004.11.14
LOL


1-1099404621
Kraj
2004-11-02 17:10
2004.11.14
ICQ


3-1097658661
Pashkerton
2004-10-13 13:11
2004.11.14
Учет времени


14-1098785843
uny
2004-10-26 14:17
2004.11.14
про ноуты


14-1098954327
dr Tr0jan
2004-10-28 13:05
2004.11.14
Разница между GMT и Московским временем