Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как изменять контрастность спрайта?


Степан ©   (2005-04-16 20:56:00) 

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

Просьба не советовать компоненты!


Sapersky   (2005-04-19 13:13:00) [1]

Она становится тусклее, но при этом видна темная середина

Возможно, гамма-коррекция нужна? Пример из FastLib ( http://prdownloads.sourceforge.net/skinner/FastLib.zip?download), A - исх. пиксель, Amount - коэфф. гаммы (1 - норма):

y:=1 / Amount;
z := Round( 255 * Exp(y * Ln(A / 255)) );
if z>255 then z:=255 else if z<0 then z:=0;
A := z;

И кстати, можно попробовать не перелопачивать всю текстуру, а менять цвет спрайта (цвет вершин) по такой или подобной формуле.


Степан   (2005-04-17 15:16:00) [2]

Я вот придумал другой способ обработки байта:

d := Round(255 / ((MaxDistance - 1) / Distance)); // Расчет байта высоты
a := Byte(PD^); // беру байт пиксела тени
a := Round(a + ((255 - a) / (255 / d)) * ((d + a / 2) / 255)); // итого

Ну так смотрится нормально... А вот Levels, как в Photoshop, я нашел и в ACDSee 6 - все таки интересно, как такое у себя сделать?


Степан   (2005-04-17 14:11:00) [3]


> XProger ©   (17.04.05 04:16)
> Степан, и сколько же теней у тебя? Ато такие "эмпирические"
> методы скоростью не блещут... Хотя, PD - какая там скорость...
> ;)

Да нормально :) Главное, чтобы тень была нормальной!


> MsShtaer ©   (17.04.05 10:43)
> Сори, A := Round(A / (Distance*k+1)) - так правильнее

А что такое k?

Механизм таков: сначала беру из спрайта тени один байт (там ведь все составляющие цвета одинаковые) - это переменная А - потом добавляю к нему число в зависимости от дистанции, и так с каждым байтом. А потом рисую через Multiply

Попробуйте нарисовать в Фотошопе черный круговой градиент на белом фоне, затем Ctrl+L - и ползунок, тот, что посередине, подвигайте влево - получается хорошая тень! Она становится тусклее, но при этом видна темная середина, а при обычном контрасте все превращается в серое пятно... Как же сделать? :)


MsShtaer   (2005-04-17 10:43:00) [4]

Сори, A := Round(A / (Distance*k+1)) - так правильнее


MsShtaer   (2005-04-17 10:41:00) [5]

A := Round(A / (MaxDistance/(Distance+1))) - Добавляю 1 чтобы небыло деления на 0.


XProger   (2005-04-17 04:16:00) [6]

Степан, и сколько же теней у тебя? Ато такие "эмпирические" методы скоростью не блещут... Хотя, PD - какая там скорость... ;)


Степан   (2005-04-17 04:12:00) [7]

Вот, что я смог придумать:

A := Round(A + (255 - A) / (255 / (255 / (MaxDistance / Distance))));

Здесь переменная А - это обрабатываемый байт, MaxDistance - максимальная высота, Distance - текущая высота... Так есть один недостаток - чем меньше контрастность (выше объект, от которого тень), тем больше расплывается... А надо, как я написал в предыдущем посте! Помогите :)


Степан   (2005-04-17 03:56:00) [8]


> XProger ©   (17.04.05 01:31)
> Не пытался альфу менять перед отрисовкой?
>
> glColor4f(R, G, B, Height/MaxHeight);
> DrawShadow;


Дык я же посредством Multiply - там без альфы... И делаю это на PowerDraw :)

Только я понял, что мне нужна не обычная контрастность, а такая, как в Фотошопе - Levels (Ctrl+L), в этом окне есть 3 ползунка в ряд, вот если взять тот, что посередине, и потаскать - то, что мне нужно! Подскажите, пожалста, как такое сделать...


XProger   (2005-04-17 01:31:00) [9]

Не пытался альфу менять перед отрисовкой?

glColor4f(R, G, B, Height/MaxHeight);
DrawShadow;


Наверх

Титульная страница Поиск, карта сайта Написать письмо