Autor Wątek: Płynę przejścia między dwoma kolorami  (Przeczytany 640 razy)

Offline ld

  • Użytkownik

# Lipiec 02, 2017, 13:13:18
Hi,

 planuje zmieniać płynie kolor obiektu z kolor1(rgb) do kolor2(rgb) w ustalonym czasie. Jak to osiągnąć?

Znalazłem pewną metodę (to było dawno i jej nie pamiętam).  Ważny był w niej dobór kolorów. Przy złym wyborze przejście odbywało się z uwzględnieniem innych kolorów np. kolor1 (odcienie kolor1)-> kolor3 (odcienie kolor3)-> (odcienie kolor2)-> kolor2. Chyba ten schemat jest jasny. Oczekiwałbym przejścia jak:  kolor1 (odcienie kolor1)-> (odcienie kolor2)-> kolor2.   Stąd drugie pytanie: jak dobrać kolory?

Dodam, że używam Corone oraz język Lua.

Pozdrawiam
ld

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline wezu

  • Użytkownik

  • +1
# Lipiec 02, 2017, 16:32:13
Typowy 'lerp' to :
// 0 <= wartość <= 1
kolor=kolor1*(1 - wartość) + kolor2*wartość
przykład jak kolor1 to czerwony -rgb (1,0,0), a kolor2 to zielony -rgb(0,1,0) a wartość to 0.3 to dostajesz kolor rgb(0.7, 0.3, 0) - jakiś taki sraczkowaty brąz.

Jeśli zamiast RGB masz kolory w HSV to wtedy pojawiają się dodatkowe kolory - przejście z czerwonego do zielonego idzie prze fioletowy, niebieski i cyjan... albo tylko żółty w zależności, w którą stronę iść i chyba tu dochodzimy do kwestii doboru kolorów, jeśli korzystasz z kolorów w formacie HSV to powinieneś użyć sąsiadujących kolorów aby uniknąć innych pośrednich barw. Sąsiednich to znaczy sąsiednich na typowym kole kolorów:
 
np niebieski + fioletowy jest ok a niebieski +żółty nie jest ok bo po drodze masz zielony.


Offline ld

  • Użytkownik

# Lipiec 02, 2017, 23:13:39
Sprawdzę twoją odpowiedź jak przystąpię do prac nad aktualizacją do gry.
Dziękuje za odpowiedź :)

Edit: Sprawdziłem. Jak najbardziej wszytko działa. Muszę popracować nad doborem kolorów.
« Ostatnia zmiana: Lipiec 15, 2017, 17:02:45 wysłana przez ld »

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

  • +1
# Lipiec 16, 2017, 20:58:01
Brzydkie przejścia między kolorami powstają też, jeśli Twoje obliczenia nie są gamma-correct (chociaż to jest dość subtelna różnica). Radzę poczytać o tym, czym jest korekcja gamma i zaimplementować to w swoim kodzie prawidłowo.

W skrócie: Komponenty RGB wszelkich kolorów zarówno wejściowych (dobranych przez artystę, odczytanych z pliku graficznego), jak i wyjściowych (wyświetlanych na ekranie) nie są w przestrzeni "liniowej" w sensie intensywności światła, tylko w funkcji pow(x, 1/2.2) - podniesione do potęgi. Dlatego przesyłając kolor z wejścia prosto na wyjście nie trzeba o tym myśleć, ale wykonując jakiekolwiek operacje na kolorach (choćby interpolację do wykonania gradientu albo alfa-blending do przezroczystości) dla poprawnego i ładniejszego efektu należy wprowadzić korekcję gamma, a więc:

- Po odczytaniu RGB wejściowego zrobić na każdym komponencie: c = pow(c, 2.2)
(Lub, jeśli programujesz w DirectX/OpenGL/Vulkan, po prostu użyć tekstury w formacie "SRGB".)
- Na tych wartościach wykonać obliczenia.
- Przed zapisaniem RGB wyjściowego zrobić: c = pow(c, 1.0/2.2)
(Lub, jeśli programujesz w DirectX/OpenGL/Vulkan, po prostu użyć tekstury w formacie "SRGB".)

Przykładowy obrazek pokazujący tę różnicę zawiera np. ta strona:
https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/how-to-apply-gamma-correction-to-a-gradient