Bufor Z
Bufor Z
Wektorowka, wektorówką ale nie mam pomysłu jak rozwiązać sprawę bufor'a Z na c64? Jakieś pomysły?
Może przejrzyj te dema:
Applause
http://noname.c64.org/csdb/release/?id=4019
Oneder
http://noname.c64.org/csdb/release/?id=11692
http://noname.c64.org/csdb/release/?id=36663
http://noname.c64.org/csdb/release/?id=4605
w nich chyba też coś było.
Musiałbyś sprecyzować czy chodzi Ci o z-buffer do rozdzielczości zoom4,
czy do efetktów w multi np. logos fonty 16x16 czy bitmapa.
Applause
http://noname.c64.org/csdb/release/?id=4019
Oneder
http://noname.c64.org/csdb/release/?id=11692
http://noname.c64.org/csdb/release/?id=36663
http://noname.c64.org/csdb/release/?id=4605
w nich chyba też coś było.
Musiałbyś sprecyzować czy chodzi Ci o z-buffer do rozdzielczości zoom4,
czy do efetktów w multi np. logos fonty 16x16 czy bitmapa.
- Sebaloz/Lepsi.De
- Posty: 3949
- Rejestracja: 14 wrz 2008, 00:02
Dokładnie chodzi mi o coś takiego (Altered States 50%)
Efekt chciałbym uzyskać na bitmapie i/lub na fontach (16x16). To w zależności od szybkości jaka osiągnę. Wypełniać, eliminować nie widoczne powierzchnie wiem jak. Z-Bufor w sam sobie tez wiem jak uzyskać tylko na c64 wydajność była by fatalna. A jak widać da się.
W one-der też bodajże jeden obiekt ma z-bufer (Applause oczywiście także). Powiem szczerze czyjegos kodu nie chce mi się rozgryzać bardziej chodzi o idee jak to szybko zrobić na c64 (tzn aby było wydajne).
Po prostu tak samo jak wypełnianie na c64 jest przez eor'owanie a opisach dotyczących pc jest to zazwyczaj inaczej rozwiązywane. z Z-buforem pewnie będzie tak samo.[/img]
Efekt chciałbym uzyskać na bitmapie i/lub na fontach (16x16). To w zależności od szybkości jaka osiągnę. Wypełniać, eliminować nie widoczne powierzchnie wiem jak. Z-Bufor w sam sobie tez wiem jak uzyskać tylko na c64 wydajność była by fatalna. A jak widać da się.
W one-der też bodajże jeden obiekt ma z-bufer (Applause oczywiście także). Powiem szczerze czyjegos kodu nie chce mi się rozgryzać bardziej chodzi o idee jak to szybko zrobić na c64 (tzn aby było wydajne).
Po prostu tak samo jak wypełnianie na c64 jest przez eor'owanie a opisach dotyczących pc jest to zazwyczaj inaczej rozwiązywane. z Z-buforem pewnie będzie tak samo.[/img]
Nie pamiętam jak wygląda cały part z Altered States, ale bazując na powyższym obrazku zauważ że w danej fazie masz doczynienia z bryla w dwoch kolorach, przy czym jeden kolor jest na sciane widoczna a drugi na sciany (normalnie niewidoczne) to jest to zwykly eor-filled albo inaczej glenz
w ktorym 3 kolor jest taki sam na sciane widoczna.
Rysujesz wszystkie sciany, najpierw niewidoczne potem widoczna.
Przy eorze nastapi blad w kawalkach wspolnych scian niewidoznych i widocznej i wystarczy dla tej kombinacji podmienic kolor na czerwony.
w ktorym 3 kolor jest taki sam na sciane widoczna.
Rysujesz wszystkie sciany, najpierw niewidoczne potem widoczna.
Przy eorze nastapi blad w kawalkach wspolnych scian niewidoznych i widocznej i wystarczy dla tej kombinacji podmienic kolor na czerwony.
O kurna, dobre to:) Kurde jakoś nie przyszło mi to do głowy a tu taki prosty myk. Dzięki.fenek pisze:Nie pamiętam jak wygląda cały part z Altered States, ale bazując na powyższym obrazku zauważ że w danej fazie masz doczynienia z bryla w dwoch kolorach, przy czym jeden kolor jest na sciane widoczna a drugi na sciany (normalnie niewidoczne) to jest to zwykly eor-filled albo inaczej glenz
w ktorym 3 kolor jest taki sam na sciane widoczna.
Rysujesz wszystkie sciany, najpierw niewidoczne potem widoczna.
Przy eorze nastapi blad w kawalkach wspolnych scian niewidoznych i widocznej i wystarczy dla tej kombinacji podmienic kolor na czerwony.
Bo w Applause to biorąc pod uwagę speed to chyba bufor z jest chyba po pixelach sprawdzany (aczkolwiek nie wiem:))
Jeżeli interesuje cię wypełniana wektorówka, to pamiętam że podobał
mi się kolorowy part z obiektem z dziurką bodajże w dentrze
Outbreak/Smash Design.
http://noname.c64.org/csdb/release/?id=11690
Efekt jest krotko pokazywany, wielokolorowy dziurawy szescian na gorze
ekranu.
Tam jest to chyba jeszcze inaczej rozwiazane, aby uzyskac wiecej kolorow scian mozna sciany niewidoczne rysowac na fontach, a widoczne na sprajtach. Dodatkowo ustawic priorytet dla sprajtow jako "nad grafika".
Istnieje jeszcze jedna metoda, mozna zrobic 3 warstwy:
logos 12x12:
1 warstwa sprajtow 4 x ilestam w pionie
2 warstwa sprajtow 4 x ilestam w pionie
Tylko tu sa potrzebne proce czyszczenia i eorow na dane warstwy.
mi się kolorowy part z obiektem z dziurką bodajże w dentrze
Outbreak/Smash Design.
http://noname.c64.org/csdb/release/?id=11690
Efekt jest krotko pokazywany, wielokolorowy dziurawy szescian na gorze
ekranu.
Tam jest to chyba jeszcze inaczej rozwiazane, aby uzyskac wiecej kolorow scian mozna sciany niewidoczne rysowac na fontach, a widoczne na sprajtach. Dodatkowo ustawic priorytet dla sprajtow jako "nad grafika".
Istnieje jeszcze jedna metoda, mozna zrobic 3 warstwy:
logos 12x12:
1 warstwa sprajtow 4 x ilestam w pionie
2 warstwa sprajtow 4 x ilestam w pionie
Tylko tu sa potrzebne proce czyszczenia i eorow na dane warstwy.
-
- Posty: 7
- Rejestracja: 15 wrz 2008, 21:22
- Grupa: blowjobb
Z-Buffer jest oczywiście dosyć kosztowny i dlatego nawet na grzybie lepszym rozwiązaniem wydaje się posortowanie wielokątów po sumie współrzędnych Z wierzchołków, i rysowanie ścian w kolejności od tych położonych najdalej do najbliższych obserwatorowi. Chyba całkiem dobrą realizacją takiego podejścia jest zastosowanie sortowania pozycyjnego - algorytm jest elegancki i względnie prosty w implementacji.
Tutaj jakieś przykładowe info: http://www.cubic.org/docs/radix.htm
Tutaj jakieś przykładowe info: http://www.cubic.org/docs/radix.htm
Ma to niestety swoje ograniczenia, tam na csdb był o tym wątek i przy statku się procedura krzaczyła, ale w przypadku prostych obiektów powinno hulać.
Apropo sortowania, to w wielu przypadkach takich jak ten idealnym rozwiązaniem jest tzw. OCEAN sort, z którego sam korzystam, nie sortuje on liczb za każdym razem od nowa, tylko ponownie sortuje istniejącą listę, jeśli mamy na niej mało zmian, to sortowanie jest bardzo szybkie.
Apropo sortowania, to w wielu przypadkach takich jak ten idealnym rozwiązaniem jest tzw. OCEAN sort, z którego sam korzystam, nie sortuje on liczb za każdym razem od nowa, tylko ponownie sortuje istniejącą listę, jeśli mamy na niej mało zmian, to sortowanie jest bardzo szybkie.
2.1.5 The "Ocean" sorting
Named this way because it can be found from many Ocean/Imagine games, like
Green Beret or Midnight Resistance. A similar algorithm is also in Dragon
Breed.
This sort routine is different from all previously mentioned. It uses an order-
array that is not resetted each time, therefore each sorting operation is a
continuation of the previous and if not much changes have happened (sprites not
moving past each other in Y-direction much) it will be very fast as it doesn't
have to do almost anything. However, there's the possibility that on some frame
it'll eat a lot of time, when there's a lot of changes in the sprite order.
First, performed only once in the beginning of the program, we need to set an
initial state for the sort order array. One choice is all the sprite numbers
going from 0 to maximum:
for (sprite = 0; sprite < maximum_sprites; sprite++)
{
sortorder[sprite] = sprite;
}
Then the sorting routine. Note one curious thing: What if the amount of sprites
onscreen changes, how can the sortroutine deal with it? Obviously, it can't,
directly. Therefore we must use for example the maximum Y-coordinate value 255
to mark unused sprites; these will fall to the bottom of the sorted list when
sorted and cause no trouble (the actual sprite display code can then easily
notice the first unused sprite and exit)
sprite1 = 0;
while (true)
{
if (spry[sortorder[sprite1+1]] < spry[sortorder[sprite1]])
{
sprite2 = sprite1;
while (true)
{
swap(sortorder[sprite2], sortorder[sprite2+1]);
if (sprite2 == 0) break;
sprite2--;
if (spry[sortorder[sprite2+1]] >= spry[sortorder[sprite2]]) break;
}
}
sprite1++;
if (sprite1 == maximum_sprites - 1) break;
}
Here's the ASM implementation:
ldx #$00
sortloop: ldy sortorder+1,x
lda spry,y
ldy sortorder,x
cmp spry,y
bcs sortskip
stx sortreload+1
sortswap: lda sortorder+1,x
sta sortorder,x
sty sortorder+1,x
cpx #$00
beq sortreload
dex
ldy sortorder+1,x
lda spry,y
ldy sortorder,x
cmp spry,y
bcc sortswap
sortreload: ldx #$00
sortskip: inx
cpx #MAXSPR-1
bcc sortloop
So, the abovementioned sorting loop produces a sorted index array of the
sprites. This array can now be walked through and sprites be copied to the
sortsprx, sortspry etc. arrays and rejected if necessary. I really feel this is
the overall best algorithm (for game use, at least) I've got to know so far.
I'm definitely going to use this in the future.
WOW Z-bufer na C64. Hm.. ciężko może być, przynajmniej w klasycznym jego wykonaniu, bo ten mechanizm jest raczej pamięciożerny, a C64 raczej nadmiaru RAMu nie ma. Pewne rozwiązanie przyśpieszenia Z-B wymyśliła firma ATI i nazwała to Hyper Z-bufer. Ogólnie trochę to podobne do tego co proponował NITRO, czyli nie czyścimy Z_bufa dla następnej klatki, tylko niejako, porównujemy go tylko z nowymi współrzędnymi i modyfikujemy w razie potrzeby. wszystko ładnie pięknie tylko że przeważnie Z-bufor jest 16-bitowy, a C64 to 8-bitowe dzieciątko, co niestety dociąża nieźle proc.
PS. Nie wiem czy nie przydało by się tu spróbować zaimplementować czegoś na niestandardowych instrukcjach 6502, ponieważ niektóre w działaniu przypominają coś na wzór MMXa z Pentium (choć tak naprawdę te rozwiązanie już stosowano w 8048 w 1984 roku), czyli można dokonywać jednocześnie operacji logicznej/arytmetycznej i przesłania zawartości rejestru.
PS. Nie wiem czy nie przydało by się tu spróbować zaimplementować czegoś na niestandardowych instrukcjach 6502, ponieważ niektóre w działaniu przypominają coś na wzór MMXa z Pentium (choć tak naprawdę te rozwiązanie już stosowano w 8048 w 1984 roku), czyli można dokonywać jednocześnie operacji logicznej/arytmetycznej i przesłania zawartości rejestru.
A szóstego dnia Bóg stworzył człowieka ... Aby mógł się napić.
Szkoda że kolega zielok nie napisze konkretnie co chce zrobić ? Mnie co prawda temat interesuje pod nieco innym kontem niż samo C64, bo ja akurat kombinuję nad algorytmami dla ATMegi 162 (16KB FLASH i 1 KB RAM+ 32KB ERAM, 8 MHz) i LCD z N3510, więc mam ok 10x szybszy proc, ale zasoby pamięciowe równie marne jak w C64, jeżeli nie marniejsze (RAM). natomiast taki tradycyjny Z-Buf to raczej algorytm porównywania osi Z, powiązany z mechanizmem nakładania tekstur, niż algorytm sortujący. Więc metoda sortowania jako alternatywny Z-Buf tez mnie interesuje.
A szóstego dnia Bóg stworzył człowieka ... Aby mógł się napić.