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

Вниз

Direct API   Найти похожие ветки 

 
Ich Hasse ©   (2002-11-04 11:36) [0]

вопрос а как вывести спрайт но с определенными сдвигами одного цвета?

к примеру есть человечек, на нем одежда зеленого цвета, штаны красные, как вывести спрайт, чтобы вместо зеленого был синий(к примеру) а вместо красного Серый???


 
Sapersky_   (2002-11-04 14:18) [1]

Т.е. скины нужно сделать, так? :)
Существуют следующие варианты:
1) Палитровая графика. На достаточно мелкого (я полагаю) человечка 256 цветов хватит без особых проблем и ухудшений качества. Правда, с подготовкой спрайтов придётся повозиться, лучше сразу рисовать их в 256 цветах и заранее выделить градиентные области для куртки, штанов и т.д. Или преобразовать True-color спрайт в 256 цветов, выделить упомянутые области программно и опять же т.д.
Выводить можно прямо из палитровой поверхности (медленнее) или сначала преобразовать к формату первичной поверхности (требует больше памяти). Можно сделать своего рода кэш оцветнённых спрайтов.
2) Маски. Где-то на DelphiGFX была статья. Но если выводить, как там написано (попиксельно) - будет медленно, лучше просчитывать заранее, или опять же делать кэш.
Можно попробовать сделать эти маски через Direct3D (аппаратно) - с мультитекстурированием или ещё как. Но формулы смешения текстур в общем довольно примитивны - сложение, умножение, ещё что-то, так что придётся долго возиться, подбирая цвета так, чтобы их сумма/произведение дала нужный.
Кстати, формулы можно менять. Через пиксельные шейдеры. 2D-программа, использующая п.ш. - это круто! :)
3) Еще вариант с D3D - регулировать цвет спрайта через цвет вершин полигона, которым он рисуется. Но это будет влиять на весь спрайт, а не только на куртку/штаны.


 
Ich Hasse ©   (2002-11-04 15:52) [2]

Мне надо как-то сдвинуть палитру при выведении определенного оттенка, но как, я согласен п.ш. это круто, и D3D тоже но у меня 2D


 
Sapersky_   (2002-11-04 16:48) [3]

Т.е. нужен непосредственно алгоритм сдвига (изменения цвета)?
Ленитесь, товарищ... Я думал, до этого можно и самому допереть... :)
Вот вариант для палитровой графики:

// src - исходная палитра, dest - результирующая

For n:=сFrom to cTo do begin
// цикл по определённому фрагменту палитры (сFrom..cTo)
// с градиентом (возможно, неравномерным) нужного цвета
m:=(src[n].r+src[n].g+src[n].b) / 768;
// считаем примерно grayscale-интенсивность
r:=Round(m * color.r * Brightness);
g:=Round(m * color.g * Brightness);
b:=Round(m * color.b * Brightness);
// определяем новые цветовые значения
// color - требуемый цвет, brightness - яркость
If r>255 then dest[n].r:=255 else dest[n].r:=r;
If g>255 then dest[n].g:=255 else dest[n].g:=g;
If b>255 then dest[n].b:=255 else dest[n].b:=b;
// на случай выхода из диапазона
end;

Для масок - см. статью на DelphiGFX, там пример есть.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
3-19503
Behemoth
2003-03-20 10:26
2003.04.07
Ошибка при вызове ADOQuery.ExecSQL...


4-19926
OlegL
2003-02-10 12:40
2003.04.07
Запуск приложения


1-19597
Shumov D.
2003-03-28 17:16
2003.04.07
OpenDialog


14-19853
Val
2003-03-21 10:04
2003.04.07
Скажи спасибо армии США!


1-19569
isma
2003-03-25 09:34
2003.04.07
ListView-вопрос?