Strona 1 z 2
fade in/out grafiki w multicolorze
: 17 maja 2010, 11:00
autor: carrion
Mam pytanie do koderów
Jak sie robi fade in/out grafiki w multicolorze.
tzn to co mi przychodzi do głowy to czytanie bajta po bajcie z $0400 i z $d800 sprawdzenie koloru a potem pobranie z tablicy fadeów koloru o niższym poziomie? tak to chyba powinno działać ale pytanie jest czy są na to jakieś triki które koderzy wypracowali?
: 17 maja 2010, 11:56
autor: skull
Dobre pytanie
Też jestem ciekaw, jakie są "podejścia" do tego tematu.
Najgorsza jest zabawa z nibblami (półbajty) - bo informacja o kolorze 1 i 2 zawarta jest razem w pojednyńczych bajtach (kolor 0 to d021, a kolor 3 pochodzi z obaszaru $d800-dbe7).
Ja robię tak:
Tablica Fade-ingu dla każdego z 16 kolorów (zależna od stopni zanikania, ale załóżmy maks 16) czyli 16x16 =256 bajtów (chociaż czarny możemy oczywiście pominąć) w notacji bajtów $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 elementów - można nawet na stronę zerową wyrzucić.
Wzorzec dla kolorów (i ten dla mapy i ten dla $d800) proponuje oczywiście umieścić w pamięci gdzieś oddzielnie, bo na jego podstawie i konkretniej fazy zaniku będziemy ustalać kolejne kolory (samomodyfikacja pożerałaby masę czasu) dla kwadratów 8x8px.
No i niestety najlepiej to wykonywać jakimś efektem(tzn nie wszystko na raz) -bo obraz jest podzielony na 1000 komórek mapy koloru, +1000 dla $d800, i obsłużyć to wszystko w jedej ramce nie jest chyba nawet możliwe.
Oczywiście można też dodać jakieś warunki przyspieszające (np pomijać od razu kolor czarny).
Kawałek kodu:
Kod: Zaznacz cały
ldy ColorCell ;dla danej komórki koloru
lda MapC_colorsSpecimen,y ;pobierz kolor (para) oryginalny
beq + ;jeśli 'pusty' to -> bierz się za nastepny
and #%00001111 ;najpierw młodszy nibble
;wpierw badamy młodszy nibble
beq l_starszy-2 ;jak czarny to dalej
tax
lda _multiTab,x ;pomnóż przez 16
ora FadePhase
tax
lda _FullFadeTable,x ;i weź odpowiadający dla fazy kolor
and #%00001111 ;tylko dla młodszego nibble
sta _cTmp2+1 ;zapamiętaj 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 ;składamy młodszy i starszy nibble
sta Colors_map,y ;i na ekran
+ iny ;następna komórka
: 17 maja 2010, 13:33
autor: zielok
skull pisze:
No i niestety najlepiej to wykonywać jakimś efektem(tzn nie wszystko na raz) -bo obraz jest podzielony na 1000 komórek mapy koloru, +1000 dla $d800, i obsłużyć to wszystko w jedej ramce nie jest chyba nawet możliwe.
Oczywiście można też dodać jakieś warunki przyspieszające (np pomijać od razu kolor czarny).
Nie pamiętam dokładnie ale wydaje mi się to jak najbardziej możliwe zrobienie w jednej ramce (ale musimy unrollowac kod i oczywiście korzystać z tabelki z kolorami do wygaszania)
Co do kolorów to najlepiej fadeout robić poprzez zgrupowanie kolorów pod względem jasności czyli z białego do czarnego nie przechodzimy w 15 kropkach ale w 8. Imo lepiej to wygląda.
Reasumując to co pisał apropo fadeout Carrion jest jak najbardziej OK i nie da się raczej inaczej tego zrobic.
Co do Fade-in to tutaj musimy rozbijać na dwie 4bitowe wartości i pobierać dane z tabelki wiec będzie wolniej ale w 50fps chyba da się radę to zrobić
: 17 maja 2010, 14:23
autor: skull
[quote="zielok"]
Nie pamiętam dokładnie ale wydaje mi się to jak najbardziej możliwe zrobienie w jednej ramce (ale musimy unrollowac kod i oczywiście korzystać z tabelki z kolorami do wygaszania)
/quote]
Ale konkrety chłopie, bo jak napisałem sam jestem ciekawy podejścia do tej sprawy - jaśniej (unrollowac kod ?).
To czy w jednej ramce da się obsłużyć efekt, zależy też oczywiście od wielkości obrazka, jednak chcąc obłużyć każdą komórkę wydaje się to nie możliwe - bo zmienić każdą komórkę 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 obsługę jedej komórki pamięci (nie wpominając o tych z mapy koloru gdzie trzeba rozdzielac na nibble), głupie lda sta to 8 cykli, a co z jakaś muzyczka w tle.
Tłumacz bo ja na razie tego nadal nie widze.
: 17 maja 2010, 16:16
autor: k.
a nie lepiej w lace zrobić ściemnianie?
: 17 maja 2010, 16:49
autor: Nitro
Mój fader działa na zasadzie przedstawionej w tym wątku i zdecydowanie nie jest to mój najlepszy kawałek kodu, bodajże o 3'ciej w nocy był napisany.
Przedstawię ideę na coś ciekawszego, poprawcie mnie jeśli coś przeoczyłem.
Potraktujmy rejestr screen ramu jako state-machine, mamy w nim maksymalnie 256 kombinacji, dla każdej chcemy uzyskać liczbę w której oba nible zostaną w jakiś sposób zmodyfikowane. Cóż za problem postawić 256 look-up tabelkę.
Przykładowo, wartości w hexach:
31 - z tabelki 20
20 - z tabelki 10
10 - z tabelki 0
0 - z tabelki 0 i się zapętla tak więc nie trzeba nic sprawdzać.
Można to spokojnie dostosować do fade'owania po luminancji.
: 17 maja 2010, 17:30
autor: skull
Nitro pisze:Mój fader działa na zasadzie przedstawionej w tym wątku i zdecydowanie nie jest to mój najlepszy kawałek kodu, bodajże o 3'ciej w nocy był napisany.
Przedstawię ideę na coś ciekawszego, poprawcie mnie jeśli coś przeoczyłem.
Potraktujmy rejestr screen ramu jako state-machine, mamy w nim maksymalnie 256 kombinacji, dla każdej chcemy uzyskać liczbę w której oba nible zostaną w jakiś sposób zmodyfikowane. Cóż za problem postawić 256 look-up tabelkę.
Przykładowo, wartości w hexach:
31 - z tabelki 20
20 - z tabelki 10
10 - z tabelki 0
0 - z tabelki 0 i się zapętla tak więc nie trzeba nic sprawdzać.
Można to spokojnie dostosować do fade'owania po luminancji.
Chyba kojarze zasadę, ale weź wpisz klika linii listingu (dla pewności)
No i teraz zdałem sobie sprawę, że można "animować" zanik na rejestrze $d018 (mapy kolorów), tyle że trzeba przed samym efektem wiliczyć 8 map kolorów (zasada analogiczna do FLI) dla każdej fazy zaniku, a potem tylko co ramkę przełączać rejestr - zostaje jeszcze kwestia $d800, ale tu już nie powinno byc problemu z wyrobieniem się. Oczywisty minus tej metody to pamieciożerność.
: 17 maja 2010, 18:11
autor: Nitro
Chyba kojarze zasadę, ale weź wpisz klika linii listingu (dla pewności)
Proste:
ldx $0400
lda lut,x
sta $0400
No i teraz zdałem sobie sprawę, że można "animować" zanik na rejestrze $d018 (mapy kolorów), tyle że trzeba przed samym efektem wiliczyć 8 map kolorów (zasada analogiczna do FLI) dla każdej fazy zaniku, a potem tylko co ramkę przełączać rejestr - zostaje jeszcze kwestia $d800, ale tu już nie powinno byc problemu z wyrobieniem się. Oczywisty minus tej metody to pamieciożerność.
Również skuteczna metoda, zawsze coś musi być zjedzone, czy to pamięć czy to proc

: 17 maja 2010, 19:52
autor: Sebaloz/Lepsi.De
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
: 17 maja 2010, 20:50
autor: carrion
kilka spostrzeżeń po tych postach:
1. przełączanie banków / obrazków jest ok jak chcemy zrobić fade całego obrazka - gdy chcemy zrobić np fade wg jakiegoś wzoru już to nie zadziała.
2. Fade co ramkę nie koniecznie jest wymogiem.
po zrobieniu tablicy fade'u mamy 8 odcieni koloru gdy zaczynamy od białego. zmiana odcienia co ramkę poskutkuje takim błyskiem, którego nawet nie da się zauważyć
3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
btw:
skodowałem to wg mojego pierwotnego pomysłu i nawet działa.
tyle tylko że teraz chciałbym aby to pokazywało się np po kształcie okręgu jak w Carrion Oldschool Pixels... tutaj mam nową zagwozdkę.
ps. wzięło mnie na kodowanie dla odmiany jak by kto pytał

: 17 maja 2010, 22:16
autor: Nitro
tyle tylko że teraz chciałbym aby to pokazywało się np po kształcie okręgu jak w Carrion Oldschool Pixels... tutaj mam nową zagwozdkę.
Musisz skądś znać koordynaty okręgu plus wziąć pod uwagę wychodzenie części okręgu poza ekran. Tak więc polecam prekalk i potem te dane ładujesz do swojej procedurki.
2. Fade co ramkę nie koniecznie jest wymogiem.
po zrobieniu tablicy fade'u mamy 8 odcieni koloru gdy zaczynamy od białego. zmiana odcienia co ramkę poskutkuje takim błyskiem, którego nawet nie da się zauważyć
IMHO 16 kolorów fade co ramkę to standard.
3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
Od tego są przerwania, pozwalają wykonać kod powtarzający się łatwo i przyjemnie. Nie ładujesz do przerwań kodu, który nie powinien się zatrzymywać tylko działać non stop kiedy go przerwania nie stopują.
: 18 maja 2010, 08:23
autor: skull
Nitro pisze:
Proste:
ldx $0400
lda lut,x
sta $0400
no ale jesli ma się to wykonać dla każdej komórki, oraz dla colorRamu to nadal nie wystarcza czasu w jednej ramce -patrz wylicznia wyżej.
tyle tylko że teraz chciałbym aby to pokazywało się np po kształcie okręgu jak w Carrion Oldschool Pixels... tutaj mam nową zagwozdkę.
nie dawno wykorzystałem (z powodzeniem) to:
Kod: Zaznacz cały
xcircle i ycircle - współrzędne środka
R=30
XC=0:YC=R
FX=0:FY=8*R:FS=4*R+3
WHILE FX<FY
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
2. Fade co ramkę nie koniecznie jest wymogiem...
3. czy tego typu kod umieszcza się w przerwaniu irq czy raczej nie koniecznie?
No to właśnie zależy od tego, czy ma być to raz na ramkę czy nie, jeśli nie to nie umieszczaj w przerwaniu, bo muzyczka będzie Ci się cieła.
@Kutfa Nitro daj tu jednak całą procedurę tego fadingu
@Sebaloz, czyli wykonaleś to dokładnie tak, jak napisałem post wcześniej.
: 18 maja 2010, 08:48
autor: zielok
skull pisze:
Ale konkrety chłopie, bo jak napisałem sam jestem ciekawy podejścia do tej sprawy - jaśniej (unrollowac kod ?).
Unrollowac kody czyli wygenerować kod który leci ciurkiem zamiast korzystać z pętli czyli
lda $xxxx
sta $yyyy
Poza tym nie mogę tego sprawdzić bo jestem w pracy a nie mam w głowie ile cykli lda czy sta zajmuje (w końcu jestem co najwyżej przeciętniakiem (c) Ramos).
Kolejna kwestia to swoją wiedzę opierałem na efekcie który kiedyś napisałem i w około 0,5 ramki zmieniam cały obszar od $0400 do $07e8 (zaznaczę, że NIE PAMIĘTAM dokładnie ile to trwa bo całkiem możliwe, że trochę dłużej niż 0,5 frame).
skull pisze:
Tłumacz bo ja na razie tego nadal nie widze.
A gdzie słowo proszę ?

: 18 maja 2010, 08:57
autor: skull
zielok pisze:
Unrollowac kody czyli wygenerować kod który leci ciurkiem zamiast korzystać z pętli czyli
lda $xxxx
sta $yyyy
Poza tym nie mogę tego sprawdzić bo jestem w pracy a nie mam w głowie ile cykli lda czy sta zajmuje (w końcu jestem co najwyżej przeciętniakiem (c) Ramos).
Kolejna kwestia to swoją wiedzę opierałem na efekcie który kiedyś napisałem i w około 0,5 ramki zmieniam cały obszar od $0400 do $07e8 (zaznaczę, że NIE PAMIĘTAM dokładnie ile to trwa bo całkiem możliwe, że trochę dłużej niż 0,5 frame).
he,he i po co te nerwy... wszystko właśnie wyjaśniłeś, i się nawet zgadza, 0,5 frame na colormap i teraz jeszcze pół frame na color ram = 1 ramka, przy jak nazwałeś "unrolowaniu". No ale taki efekt moim zdaniem "za dużo kosztuje", i wykonanie jego będzie najwyżej "na styk" - może trzeba się będzie nawet pożegnać z playerem od muzyczki.
Na samym początku napisałem, że mnie właśnie ciekawi podejście do tego tematu, bo uważam go zwyczajnie za trudny do prostego wykonania.
skull pisze:
Tłumacz bo ja na razie tego nadal nie widze.
zielok pisze:
A gdzie słowo proszę ?

proście, a będziecie prości.
: 18 maja 2010, 09:26
autor: zielok
skull pisze:
he,he i po co te nerwy...
To poco się denerwujesz? Bo chyba nie twierdzisz, że ja mam nerwy

: 18 maja 2010, 16:12
autor: Nitro
no ale jesli ma się to wykonać dla każdej komórki, oraz dla colorRamu to nadal nie wystarcza czasu w jednej ramce -patrz wylicznia wyżej.
Prawda, choć nie wziąłeś jednego sposobu pod uwagę, puszczenia kodu od dolnej ramki, za każdym razem będzie się troche zwiększać ale powinno wystarczyć na cały fade.
Ogólnie mówię cały czas o fade oucie który jest prostszy bo wartości wyjściowe wszystkich komórek są jednakowe.
Co do fadeinu, to metoda na całkowity precalc screenramów będzie najlepszym rozwiązaniem, do dwóch banków bitmapy i voila, mamy 16'o kolorowy fade.
Kutfa Nitro daj tu jednak całą procedurę tego fadingu
Mówisz o fadeoucie? Jak wyżej.
: 18 maja 2010, 16:23
autor: skull
dobra juz widze, czyli rewolucji nie bedzie.
: 18 maja 2010, 16:39
autor: zielok
skull pisze:dobra juz widze, czyli rewolucji nie bedzie.
Wykorzystać DMA w REU i będzie rewolucja

: 18 maja 2010, 17:49
autor: Sebaloz/Lepsi.De
skull pisze:nie dawno wykorzystałem (z powodzeniem) to:
Trzeba bylo wrzucic linka do calosci
http://atariarea.krap.pl/forum/viewtopi ... 75#p104175
: 18 maja 2010, 18:02
autor: skull
hehe, ale ja wykorzystałem tylko to co wkleiłem

)))