Page 1 of 1

POLISH: Mini-Tutorial - Działanie grafiki w NES

Posted: Sun Oct 19, 2008 2:27 am
by sdm
2012 EDIT:

Wcielo linki z obrazkami, wiec odsylam jak cos na PL forum:
http://www.forum.emunes.pl/index.php/topic,1590.0.html

4 polish NES users: :P

Małe info dotyczące grafiki NES'a, przydatne jak ktoś nie jest w stanie załapac o co biega w tym wszystkim i dopiero zaczyna cos dlubac w asemblerku na NES. Napisałem bardzo łopatologicznie, wiele się powtarzając, wszystko dla dobra sprawy. Mam nadzieję, ze komuś sie przyda...

Name Table to ogólnie widoczny cały ekran w pełnej rozdzielczości NES'a - 256x240 pixeli, który składa się z tablicy 32x30 Tiles'ów (każdy 8x8 pikseli). Name Table dokładnie ma rozmiar 1024 bajtów, a każdy bajt odpowiada jednemu Tiles'owi ( zawiera numer Tilesa znajdującego się w Pattern Table/CHR ROM). Kto potrafi liczyć, zapewne doszedł do pewnej niezgodności, bo skoro Name Table składające się z grupy 32x30 ma ich 960, to dlaczego ma rozmiar 1024 bajtów? Sprawa jest prosta - ostatnie 64 bajty to Attribute Table - tablica zawierająca dane kolorów z palety NES'a. Każdy bajt w Attribute Table odpowiada za grupę 4x4 Tilesów na ekranie - czyli kolejne podzielenie całego ekranu na tablice 32x32 pixele. Na tym nie koniec, taka tablica 32x32 pixele (4x4 Tiles'y) dzieli sie ponownie na cztery części - każda zwie się Square (0,1,2,3). Square składa się z 2x2 Tiles'ów (cztery Tiles'y). Każde Square może posiadać zdefiniowany w Attribute Table adres banku kolorów w palecie tła (16 wcześniej zdefiniowanych kolorów przez użytkownika w palecie tła). Cała paleta posiada zdefiniowane 32 kolory - 16 dla tła oraz drugie 16 dla sprite'ów. Nas interesuje paleta tła, podzielona na cztery banki, każdy po 4 kolory. Jedno Square czyli kwadrat 2x2 Tilesy może mieć maksymalnie 4 kolory - tyle ile jeden bank w palecie. Właśnie po to jest Attribute Table. Innym słowem - nie można zrobic obiektu 16x16 pixeli np. drzewa używajac więcej niż 4 kolory. Takie ograniczenie ma NES (pomijam wieksze możliwosci dodane przez sprzętowe kontrolery pamięci).
Aha.. Attribute Table można sobie w kodzie zrobic, a Name Table np. jako plik 960 bajtowy. Jednak przydatniej miec wszystko w jednym pliku.

Tablice atrybutów posiada także Sprite. Jest ona nieco inna, posiada wiecej możliwości. Pamięc przeznaczona na Sprite'y to 256 bajtów - jedna ze "stron" pamięci WRAM (2KB). Nie jest ona na stałe nigdzie, trzeba ja zaadresowac używając jeden z rejestrów za to odpowiedzialny ($2003, ale nie będę zagłębiał się, bo to nie tutorial ASM ;) )


Teraz przedstawie to obrazkowo, sporo się powtarzając dla dobra sprawy ;P

Name Table. Różnica między PAL a NTSC nie jest niczym specjalnie trudnym do zrozumienia. NT jest taka sama dla PAL jak i NTSC, jedyną ważniejszą różnicą jest brak wyświetlanych górnych i dolnych 8 pikseli obrazu. Więc projektując coś pod NTSC należy pamiętac, aby nie "malowac" tam nic ważnego, ponieważ w NTSC na ekranie nię będzie to widoczne. Rozmiar jest ten sam dla PAL/NTSC czyli 1024 bajty, z czego 960 to 32x30 Tiles'ów i na końcu 64 bajty atrybutów kolorów.
Image


Każdy bajt w Name Table to 8-bitowy (czyli 1bajt) numer Tiles'a znajdującego się w CHR ROM (Pattern Table inaczej - bo CHR ROM to właśnie PATTERN TABLE).
Ilośc Tiles'ów w Pattern Table dla tła (tak, tła, bo te 8KB CHR jest podzielone na połowę - jedna dla Sprajtów a druga dla Tła) to 256. Oczywiście 'numerki' zapisane w hex'ach, czyli pierwszy Tiles to 00 a ostatni FF.
Polecam Windows'owski kalkulator przestawiony na "Widok Naukowy" - ma świetne opcje przeliczania różnych wartości na binarne, Hex, dec. itd. W obie strony.

Image

Każdy jeden bajt w Attribute Table odpowiada za przypisanie odpowiedniego banku kolorów z Palety tła do grupy 4x4 Tiles'ów. Tych bajtów atrybutów jest 64 sztuki, tyle co na ekranie jest grup 4x4 (32x32 pix). Taka grupa 4x4 dzieli się ponownie na cztery części, czyli cztery grupki 2x2 tilesów zwane SQUARE. Na cztery części dzieli się także bajt, dając nam możliwośc zmiany kolorów każdej grupce 2x2 osobno (każdej Square).

Image
Image


Tutaj mamy przedstawione wszystko najprościej. Na ekranie (w Name Table) wstawiliśmy cztery takie same grzybki, jednak dzięki Attribute Table zmienione zostały banki kolorów na cztery różne dla każdej Square (Grzybek to akurat jedne Square 2x2 Tiles). Teraz każdy grzybek (każde Square) ma inne kolory (mimo, ze fizycznie sa identyczne).

Image


Pattern Table. To nic innego jak CHR ROM. NROM może zaadresowac tylko 8KB danych CHR, które są podzielone na dwie części. Jedna (pierwsze 4KB) to cała grafika (256 Tiles'ów) przeznaczonych na Sprajty. Drugie 4KB to cała grafa przeznaczona na tła (także 256 sztuk Tiles'ów). Podział nie jest na stałe i można go zmienic np. grafika tła będzie piewszymi 4KB, a sprajty drugie. Wszystko zmieniamy w rejestrze kontrolującym PPU. Jednak przyjeło się, ze pierwsze to SPR, a drugie BGR (BKG). Jak juz pisałem wcześniej, każdy z 256 Tilesów ma swój adres/numer od 00 do FF (1-256) i dzięki temu można bardzo szybko przypisac cos w kodzie do danego Tiles'a. Przypomina to układanie porozwalanych puzli (Pattern Table) w całośc (Name Table).

Image
Image



Sprites. Zabawa ze sprajtami przypomina nieco to, co robimy z grafiką tła.
Nie ma tylko czegoś takiego jak Name Table dla sprajtów, wszystkie sprajciki definiujemy nieco inaczej. Wszystkich sprites może byc max. 64 sztuki, każdy ma swoje 4 bajty atrybutów, a wszystko mieści się w 256 bajtach pamieci WRAM.

Image