Форум: "Игры";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Вниз
Как изменять контрастность спрайта? Найти похожие ветки
← →
Степан (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c