Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

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

 
Степан   (2005-04-16 20:56) [0]

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

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


 
XProger ©   (2005-04-17 01:31) [1]

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

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


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


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


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

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


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

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

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

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


 
XProger ©   (2005-04-17 04:16) [4]

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


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

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


 
MsShtaer ©   (2005-04-17 10:43) [6]

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


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


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

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


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

А что такое k?

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

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


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

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

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

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


 
Sapersky   (2005-04-19 13:13) [9]

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

Возможно, гамма-коррекция нужна? Пример из 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;

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



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
3-1120023390
Tirex
2005-06-29 09:36
2005.08.07
Количество компонентов Query


3-1119542398
Koala
2005-06-23 19:59
2005.08.07
Помогите организовать ХП (Firebird)


1-1121782410
Sam Stone
2005-07-19 18:13
2005.08.07
Кодировка текстового файла


4-1118325354
Андрей Жук
2005-06-09 17:55
2005.08.07
Какой функцией можно получить параметры памяти процесса


14-1121436123
Андрей Жук
2005-07-15 18:02
2005.08.07
Какие "максимальные" процессоры поддерживали AT-материнки?