Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: fade in/out grafiki w multicolorze  (Przeczytany 1704 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline c---n

  • Level 5
  • *****
  • Wiadomości: 861
fade in/out grafiki w multicolorze
« dnia: 17 Maja 2010, 09:00 »
Mam pytanie do koderow
Jak sie robi fade in/out grafiki w multicolorze.
tzn to co mi przychodzi do glowy to czytanie bajta po bajcie z $0400 i z $d800 sprawdzenie koloru a potem pobranie z tablicy fadeow koloru o nizszym poziomie? tak to chyba powinno dzialac ale pytanie jest czy sa na to jakies triki ktore koderzy wypracowali?



Offline Skull

  • Level 6
  • ******
  • Wiadomości: 2034
fade in/out grafiki w multicolorze
« Odpowiedź #1 dnia: 17 Maja 2010, 09:56 »
Dobre pytanie \"Smile\"

Tez jestem ciekaw, jakie sa \"podejscia\" do tego tematu.
Najgorsza jest zabawa z nibblami (polbajty) - bo informacja o kolorze 1 i 2 zawarta jest razem w pojednynczych bajtach (kolor 0 to d021, a kolor 3 pochodzi z obaszaru $d800-dbe7).
Ja robie tak:
Tablica Fade-ingu dla kazdego z 16 kolorow (zalezna od stopni zanikania, ale zalozmy maks 16) czyli 16x16 =256 bajtow (chociaz czarny mozemy oczywiscie pominac) w notacji bajtow $KOLOR|KOLOR, czyl np czerwony to $22, druga tabelka na indeks dla koloeu w tabeli zanikania - czyli w tym przypadku kolor*16, dla 16 kolorow to 16 elementow - mozna nawet na strone zerowa wyrzucic.
Wzorzec dla kolorow (i ten dla mapy i ten dla $d800) proponuje oczywiscie umiescic w pamieci gdzies oddzielnie, bo na jego podstawie i konkretniej fazy zaniku bedziemy ustalac kolejne kolory (samomodyfikacja pozeralaby mase czasu) dla kwadratow 8x8px.
No i niestety najlepiej to wykonywac jakims efektem(tzn nie wszystko na raz) -bo obraz jest podzielony na 1000 komorek mapy koloru, +1000 dla $d800, i obsluzyc to wszystko w jedej ramce nie jest chyba nawet mozliwe.
Oczywiscie mozna tez dodac jakies warunki przyspieszajace (np pomijac od razu kolor czarny).
Kawalek kodu:

                   
Kod:
 :  :

ldy ColorCell :  : :  : :  ::dla danej komorki koloru
lda MapC_colorsSpecimen,y :  ::pobierz kolor (:para): oryginalny
beq + :  : :  : :  : :  ::jesli \'pusty\' to -> bierz sie za nastepny
and #%00001111 :  : :  ::najpierw mlodszy nibble
:wpierw badamy mlodszy nibble
beq l_starszy-2 :  : :  ::jak czarny to dalej
tax
lda _multiTab,x :  : :  ::pomnoz przez 16
ora FadePhase
tax
lda _FullFadeTable,x :  ::i wez odpowiadajacy dla fazy kolor
and #%00001111 :  ::tylko dla mlodszego nibble
sta _cTmp2+1 :  : :  ::zapamietaj dalej (:dla OR): :  : :  :
l_starszy
lda MapC_colorsSpecimen,y :  ::pobierz kolor (:para): oryginalny
and #%11110000 :  ::teraz starszy nibble
beq _cTmp2 :  : :  ::czarny ?
ora FadePhase :  : :  : :  :
tax
lda _FullFadeTable,x
and #%11110000
_cTmp2 :  : :  :ora #$00 :  ::skladamy mlodszy i starszy nibble
sta Colors_map,y :  : :  ::i na ekran
+ :  :iny :  :  : :nastepna komorka

zielok__

  • Gość
fade in/out grafiki w multicolorze
« Odpowiedź #2 dnia: 17 Maja 2010, 11:33 »
                   
skull napisal:

No i niestety najlepiej to wykonywac jakims efektem(tzn nie wszystko na raz) -bo obraz jest podzielony na 1000 komorek mapy koloru, +1000 dla $d800, i obsluzyc to wszystko w jedej ramce nie jest chyba nawet mozliwe.
Oczywiscie mozna tez dodac jakies warunki przyspieszajace (np pomijac od razu kolor czarny).


Nie pamietam dokladnie ale wydaje mi sie to jak najbardziej mozliwe zrobienie w jednej ramce (ale musimy unrollowac kod i oczywiscie korzystac z tabelki z kolorami do wygaszania)
Co do kolorow to najlepiej fadeout robic poprzez zgrupowanie kolorow pod wzgledem jasnosci czyli z bialego do czarnego nie przechodzimy w 15 kropkach ale w 8. Imo lepiej to wyglada.
Reasumujac to co pisal apropo fadeout Carrion jest jak najbardziej OK i nie da sie raczej inaczej tego zrobic.
Co do Fade-in to tutaj musimy rozbijac na dwie 4bitowe wartosci i pobierac dane z tabelki wiec bedzie wolniej ale w 50fps chyba da sie rade to zrobic

Offline Skull

  • Level 6
  • ******
  • Wiadomości: 2034
fade in/out grafiki w multicolorze
« Odpowiedź #3 dnia: 17 Maja 2010, 00:00 »
Cytat: \"zielok\"
Nie pamietam dokladnie ale wydaje mi sie to jak najbardziej mozliwe zrobienie w jednej ramce (ale musimy unrollowac kod i oczywiscie korzystac z tabelki z kolorami do wygaszania)
/quote]
Ale konkrety chlopie, bo jak napisalem sam jestem ciekawy podejscia do tej sprawy - jasniej (unrollowac kod ?).
To czy w jednej ramce da sie obsluzyc efekt, zalezy tez oczywiscie od wielkosci obrazka, jednak chcac obluzyc kazda komorke wydaje sie to nie mozliwe - bo zmienic kazda komorke z tych 2000 to chyba tylko \"lda sta\" zostaje.
312 linii (PAL) * 63 cykle = 19656
- 25*40 (BadLines)
daje to 18656 / 2000 = 9,32 cykla na obsluge jedej komorki pamieci (nie wpominajac o tych z mapy koloru gdzie trzeba rozdzielac na nibble), glupie lda sta to 8 cykli, a co z jakas muzyczka w tle.
Tlumacz bo ja na razie tego nadal nie widze.

Offline Kisiel

  • Level 7
  • *******
  • Wiadomości: 11447
  • Number 7 in all users competition...
    • http://wiki.projekt64.filety.pl/doku.php
fade in/out grafiki w multicolorze
« Odpowiedź #4 dnia: 17 Maja 2010, 14:16 »
a nie lepiej w lace zrobic sciemnianie?
idz wyprostowany wśród tych co idą na kolanach

...w przypadku checi zakupu UK1541,GA,MA,T8500,T7501 prosze o kontakt na Facebooku, haslo: UK1541....

Nitro__

  • Gość
fade in/out grafiki w multicolorze
« Odpowiedź #5 dnia: 17 Maja 2010, 14:49 »
Moj fader dziala na zasadzie przedstawionej w tym watku i zdecydowanie nie jest to moj najlepszy kawalek kodu, bodajze o 3\'ciej w nocy byl napisany.
Przedstawie idee na cos ciekawszego, poprawcie mnie jesli cos przeoczylem.
Potraktujmy rejestr screen ramu jako state-machine, mamy w nim maksymalnie 256 kombinacji, dla kazdej chcemy uzyskac liczbe w ktorej oba nible zostana w jakis sposob zmodyfikowane. Coz za problem postawic 256 look-up tabelke.
Przykladowo, wartosci w hexach:
31 - z tabelki 20
20 - z tabelki 10
10 - z tabelki 0
0 - z tabelki 0 i sie zapetla tak wiec nie trzeba nic sprawdzac.
Mozna to spokojnie dostosowac do fade\'owania po luminancji.

Offline Skull

  • Level 6
  • ******
  • Wiadomości: 2034
fade in/out grafiki w multicolorze
« Odpowiedź #6 dnia: 17 Maja 2010, 15:30 »
                   
Nitro napisal:
Moj fader dziala na zasadzie przedstawionej w tym watku i zdecydowanie nie jest to moj najlepszy kawalek kodu, bodajze o 3\'ciej w nocy byl napisany.
Przedstawie idee na cos ciekawszego, poprawcie mnie jesli cos przeoczylem.
Potraktujmy rejestr screen ramu jako state-machine, mamy w nim maksymalnie 256 kombinacji, dla kazdej chcemy uzyskac liczbe w ktorej oba nible zostana w jakis sposob zmodyfikowane. Coz za problem postawic 256 look-up tabelke.
Przykladowo, wartosci w hexach:
31 - z tabelki 20
20 - z tabelki 10
10 - z tabelki 0
0 - z tabelki 0 i sie zapetla tak wiec nie trzeba nic sprawdzac.
Mozna to spokojnie dostosowac do fade\'owania po luminancji.


Chyba kojarze zasade, ale wez wpisz klika linii listingu (dla pewnosci)

No i teraz zdalem sobie sprawe, ze mozna \"animowac\" zanik na rejestrze $d018 (mapy kolorow), tyle ze trzeba przed samym efektem wiliczyc 8 map kolorow (zasada analogiczna do FLI) dla kazdej fazy zaniku, a potem tylko co ramke przelaczac rejestr - zostaje jeszcze kwestia $d800, ale tu juz nie powinno byc problemu z wyrobieniem sie. Oczywisty minus tej metody to pamieciozernosc.

Nitro__

  • Gość
fade in/out grafiki w multicolorze
« Odpowiedź #7 dnia: 17 Maja 2010, 16:11 »
                   
Cytat:
Chyba kojarze zasade, ale wez wpisz klika linii listingu (dla pewnosci)

Proste:
ldx $0400
lda lut,x
sta $0400


                   
Cytat:

No i teraz zdalem sobie sprawe, ze mozna \"animowac\" zanik na rejestrze $d018 (mapy kolorow), tyle ze trzeba przed samym efektem wiliczyc 8 map kolorow (zasada analogiczna do FLI) dla kazdej fazy zaniku, a potem tylko co ramke przelaczac rejestr - zostaje jeszcze kwestia $d800, ale tu juz nie powinno byc problemu z wyrobieniem sie. Oczywisty minus tej metody to pamieciozernosc.

Rowniez skuteczna metoda, zawsze cos musi byc zjedzone, czy to pamiec czy to proc \"Smile\"

Offline Sebaloz

  • Level 6
  • ******
  • Wiadomości: 1520
fade in/out grafiki w multicolorze
« Odpowiedź #8 dnia: 17 Maja 2010, 17:52 »
Ja generowalem 7 zestawow z kolorami ekranu obrazka oraz generowalem tabelke z kolorami d800 obrazka:

*=$8000
siedem przejsc koloru d800 od najciemniejszego do najjasniejszego,
*=$8000+7
siedem przejsc koloru d801 od najciemniejszego do najjasniejszego,
*=$8000+14
siedem przejsc koloru d802 od najciemniejszego do najjasniejszego,
itd

Potem tylko przelaczalem wygenerowane ekrany od najciemniejszego do najjasnieszego, po pokazaniu sie calego obrazka przelaczalem wygenerowane ekrany od najjasniejszego do najciemniejszego, a po kazdym przelaczeniu ekranu puszczalem przepisanie d800, ktore spokojnie miescilo sie w jednej ramce, mozna bylo puscic na przerwaniach a w tle uzywac loadera KM\'a.

ldx #$00
jsr przelacz-ekran
jsr przepisanied800
inx
cpx #$07
bne *-9

ldx #$05
jsr przelacz-ekran
jsr przepisanied800
dex
cpx #$ff
bne *-9


przepisanied800:
(procedurka zajmuje $1770 pamieci, mozna ja skrocic pomijajac miejsca z czarnym kolorem)

lda $8000,x
sta $d800
lda $8000+7,x
sta $d800+1
lda $8000+14,x
sta $d800+2
itd..
rts

Offline c---n

  • Level 5
  • *****
  • Wiadomości: 861
fade in/out grafiki w multicolorze
« Odpowiedź #9 dnia: 17 Maja 2010, 18:50 »
kilka spostrzezen po tych postach:
1. przelaczanie bankow / obrazkow jest ok jak chcemy zrobic fade calego obrazka - gdy chcemy zrobic np fade wg jakiegos wzoru juz to nie zadziala.

2. Fade co ramke nie koniecznie jest wymogiem.
po zrobieniu tablicy fade\'u mamy 8 odcieni koloru gdy zaczynamy od bialego. zmiana odcienia co ramke poskutkuje takim blyskiem, ktorego nawet nie da sie zauwazyc \"Wink\"

3. czy tego typu kod umieszcza sie w przerwaniu irq czy raczej nie koniecznie?

btw:
skodowalem to wg mojego pierwotnego pomyslu i nawet dziala.
tyle tylko ze teraz chcialbym aby to pokazywalo sie np po ksztalcie okregu jak w Carrion Oldschool Pixels... tutaj mam nowa zagwozdke.

ps. wzielo mnie na kodowanie dla odmiany jak by kto pytal \"Smile\"

Nitro__

  • Gość
fade in/out grafiki w multicolorze
« Odpowiedź #10 dnia: 17 Maja 2010, 20:16 »
                   
Cytat:

tyle tylko ze teraz chcialbym aby to pokazywalo sie np po ksztalcie okregu jak w Carrion Oldschool Pixels... tutaj mam nowa zagwozdke.

Musisz skads znac koordynaty okregu plus wziac pod uwage wychodzenie czesci okregu poza ekran. Tak wiec polecam prekalk i potem te dane ladujesz do swojej procedurki.

                   
Cytat:

2. Fade co ramke nie koniecznie jest wymogiem.
po zrobieniu tablicy fade\'u mamy 8 odcieni koloru gdy zaczynamy od bialego. zmiana odcienia co ramke poskutkuje takim blyskiem, ktorego nawet nie da sie zauwazyc

IMHO 16 kolorow fade co ramke to standard.

                   
Cytat:

3. czy tego typu kod umieszcza sie w przerwaniu irq czy raczej nie koniecznie?

Od tego sa przerwania, pozwalaja wykonac kod powtarzajacy sie latwo i przyjemnie. Nie ladujesz do przerwan kodu, ktory nie powinien sie zatrzymywac tylko dzialac non stop kiedy go przerwania nie stopuja.

Offline Skull

  • Level 6
  • ******
  • Wiadomości: 2034
fade in/out grafiki w multicolorze
« Odpowiedź #11 dnia: 18 Maja 2010, 06:23 »
                   
Nitro napisal:

Proste:
ldx $0400
lda lut,x
sta $0400

no ale jesli ma sie to wykonac dla kazdej komorki, oraz dla colorRamu to nadal nie wystarcza czasu w jednej ramce -patrz wylicznia wyzej.


                   
Cytat:

tyle tylko ze teraz chcialbym aby to pokazywalo sie np po ksztalcie okregu jak w Carrion Oldschool Pixels... tutaj mam nowa zagwozdke.

nie dawno wykorzystalem (z powodzeniem) to:

                   
Kod:
xcircle i ycircle - wspolrzedne srodka

 :R=30
 :XC=0::YC=R
 :FX=0::FY=8*R::FS=4*R+3
 :WHILE FX :  :splot8 :  : //splot8 are eight plotz around the circle
 :  :XC=XC+1
 :  :FX=FX+8
 :  :IF FS>0
 :  :  :FS=FS-FX-4
 :  :ELSE
 :  :  :YC=YC-1
 :  :  :FY=FY-8
 :  :  :FS=FS-FX-4+FY
 :  :ENDIF
 :WEND

splot8
 :plot xcircle+XC,ycircle+YC
 :plot xcircle+XC,ycircle-YC
 :plot xcircle-XC,ycircle-YC
 :plot xcircle-XC,ycircle+YC

 :plot xcircle+YC,ycircle+XC
 :plot xcircle+YC,ycircle-XC
 :plot xcircle-YC,ycircle-XC
 :plot xcircle-YC,ycircle+XC




                   
Cytat:

2. Fade co ramke nie koniecznie jest wymogiem...

                   
Cytat:

3. czy tego typu kod umieszcza sie w przerwaniu irq czy raczej nie koniecznie?

No to wlasnie zalezy od tego, czy ma byc to raz na ramke czy nie, jesli nie to nie umieszczaj w przerwaniu, bo muzyczka bedzie Ci sie ciela.

@Kutfa Nitro daj tu jednak cala procedure tego fadingu
@Sebaloz, czyli wykonales to dokladnie tak, jak napisalem post wczesniej.

zielok__

  • Gość
fade in/out grafiki w multicolorze
« Odpowiedź #12 dnia: 18 Maja 2010, 06:48 »
                   
skull napisal:

Ale konkrety chlopie, bo jak napisalem sam jestem ciekawy podejscia do tej sprawy - jasniej (unrollowac kod ?).


Unrollowac kody czyli wygenerowac kod ktory leci ciurkiem zamiast korzystac z petli czyli
lda $xxxx
sta $yyyy

Poza tym nie moge tego sprawdzic bo jestem w pracy a nie mam w glowie ile cykli lda czy sta zajmuje (w koncu jestem co najwyzej przecietniakiem (c) Ramos).
Kolejna kwestia to swoja wiedze opieralem na efekcie ktory kiedys napisalem i w okolo 0,5 ramki zmieniam caly obszar od $0400 do $07e8 (zaznacze, ze NIE PAMIETAM dokladnie ile to trwa bo calkiem mozliwe, ze troche dluzej niz 0,5 frame).

                   
skull napisal:

Tlumacz bo ja na razie tego nadal nie widze.


A gdzie slowo prosze ? \"Smile\"

Offline Skull

  • Level 6
  • ******
  • Wiadomości: 2034
fade in/out grafiki w multicolorze
« Odpowiedź #13 dnia: 18 Maja 2010, 06:57 »
                   
zielok napisal:

Unrollowac kody czyli wygenerowac kod ktory leci ciurkiem zamiast korzystac z petli czyli
lda $xxxx
sta $yyyy

Poza tym nie moge tego sprawdzic bo jestem w pracy a nie mam w glowie ile cykli lda czy sta zajmuje (w koncu jestem co najwyzej przecietniakiem (c) Ramos).
Kolejna kwestia to swoja wiedze opieralem na efekcie ktory kiedys napisalem i w okolo 0,5 ramki zmieniam caly obszar od $0400 do $07e8 (zaznacze, ze NIE PAMIETAM dokladnie ile to trwa bo calkiem mozliwe, ze troche dluzej niz 0,5 frame).

he,he i po co te nerwy... wszystko wlasnie wyjasniles, i sie nawet zgadza, 0,5 frame na colormap i teraz jeszcze pol frame na color ram = 1 ramka, przy jak nazwales \"unrolowaniu\". No ale taki efekt moim zdaniem \"za duzo kosztuje\", i wykonanie jego bedzie najwyzej \"na styk\" - moze trzeba sie bedzie nawet pozegnac z playerem od muzyczki.

Na samym poczatku napisalem, ze mnie wlasnie ciekawi podejscie do tego tematu, bo uwazam go zwyczajnie za trudny do prostego wykonania.

                   
skull napisal:

Tlumacz bo ja na razie tego nadal nie widze.

                   
zielok napisal:

A gdzie slowo prosze ? \"Smile\"

proscie, a bedziecie prosci.

zielok__

  • Gość
fade in/out grafiki w multicolorze
« Odpowiedź #14 dnia: 18 Maja 2010, 07:26 »
                   
skull napisal:

he,he i po co te nerwy...


To poco sie denerwujesz? Bo chyba nie twierdzisz, ze ja mam nerwy \"Smile\"