BPP

aus RHWiki, der freien Romhacking-Enzyklopädie

BPP ist die Abkürzung für 'Bits per Pixel' (= Bits pro Bildpunkt). In Grafiken wird damit die Farbtiefe angegeben: Je mehr Bits einem Pixel zur Verfügung stehen, desto breiter ist die Palette aus welcher die Farbe des Pixels gewählt werden kann. Ist die Farbtiefe sehr groß, kann auch direkt aus dem RGB-Spektrum gewählt werden.

Die Maximalzahl der wählbaren Farben ergibt sich durch:

Farbzahl = (2 ^ BPP)

Ein Bild mit bspw. 1bpp hätte also nur 2 Farben - in der Regel sind das Schwarz und Weiß, wohingegen ein Bild bei 2bpp schon 4 Farben haben kann.

Darstellungsweise

Hier soll das grundliegende Prinzip des Gebrauchs von palettierten Tiles (also Tiles, die keine vollen 16/32 bit für die Farbwahl verwenden) gezeigt werden. Außerdem soll man hier einmal eine Vorstellung davon kriegen, wie die Pixel nun wirklich definiert sind und wie das ganze vom Byte zum Pixel bzw. zur Farbe wird. Die Beispiele hier beziehen sich auf den Gameboy und den Wonderswan Color.

2bpp auf dem Gameboy (Color) 4bpp auf dem Wonderswan Color
vergrößern
vergrößern

Die Palette zu dem Bild enthält die Farben Weiß, Orange, Pink und Schwarz. Wenn wir nun in exakt dieser Reihenfolge Farbnummern von 0 bis 3 verteilen und diese auf unser Bild umsetzen, erhalten wir das Bild rechts daneben.
Mit anderen Worten, die Bytes im Rom müssen irgendwie zu eben diesen Farbnummern der Palette führen, da diese ja den Pixel definieren. Nun werfen wir ersteinmal einen Blick auf die dazugehörigen Bytes im Rom:

vergrößern

Da unser System 2bpp ist, brauchen wir also pro Pixel 2 Bits, also pro Pixel-Reihe 2 Bytes und pro Tile demnach 0x10 Bytes.
Wir nehmen nun die ersten Beiden Bytes und schauen sie uns vertauscht in Binär untereinander gelegt an. Wenn wir jetzt von oben nach unten jede Spalte durchgehen und die Werte wieder von Binär in Dezimal umwandeln, ergeben sich genau unsere Farbnummern, die wir im oberen rechten Bild der ersten Pixel-Reihe zugeordnet haben. Das wir nur 2 Bytes nehmen, liegt daran, dass wir bloß 2 Bits pro Pixel brauchen, also von jedem Byte bloß jeweils 1 Bit nehmen. Die Leserichtung der Bits (hier von Bit7 zu Bit0) kann auf verschiedenen Systemen anders sein. Auf dem Gameboy ist sie von 'link' nach 'rechts', also wie bereits erwähnt von Bit7 nach Bit0.

0 0 0 1 1 0 0 0 Byte 2, 0x18 in Binär
0 0 0 1 1 0 0 0 Byte 1, 0x18 in Binär


0 0 0 3 3 0 0 0 Farbnummern in dezimal


Dieselbe Methode lässt sich auch auf alle anderen Zeilen anwenden. Wichtig dabei ist, dass die Leserichtung jeder Spalte auf anderen Systemen ebenfalls variieren kann. Hier (also mit dem Gameboy-Format) ist sie jedoch von oben nach unten, wenn man 2 aufeinanderfolgende Bytes 'vertauscht in Binär untereinander legt'.

0 0 0 1 0 1 0 0 Byte 4, 0x14 in Binär
0 0 0 1 1 1 0 0 Byte 3, 0x1C in Binär


0 0 0 3 1 3 0 0 Farbnummern in dezimal

Es geht immer so weiter, bis ein ganzes Tile mit 8x8 Pixeln entsteht.

vergrößern
vergrößern

Die Palette zu diesem Bild enthält insgesamt 16 Farben, ich werde nur die benutzten und ihre Nummern nennen. 0, Schwarz; 1, Dunkelgrau; 2, Hellgrau; 3, schmutziges Weiß; 4, Hellblau; 7, Dunkelblau. Das rechte Bild beinhaltet wieder diese Nummern, damit es besser Vorstellbar ist.
Wir brauchen natürlich bei 16 wählbaren Farben 2mal soviele Bytes, als das bei 2bpp der Fall war.

vergrößern

Da es 4 Bits per Pixel sind, brauchen wir 4 Byte pro Pixelreihe und insgesamt 0x20 Bytes pro 8x8 Tile.
Die Bytes werden wieder in Binär umgewandelt und untereinander angeordnet, auch diesmal vertauschen wir die Bytereihenfolge wieder. Da die ersten 4 Bytes nur 0x00 sind und die erste Reihe auch nur aus Pixeln mit Farbnummer 0 besteht, ist diese nicht sehr aufschlussreich und wir fangen mit Pixelreihe 2 an.

0 0 0 0 0 0 0 0 Byte 7, 0x00 in Binär
1 1 0 0 0 0 0 1 Byte 6, 0xC1 in Binär
1 1 0 1 1 1 0 1 Byte 5, 0xDD in Binär
1 1 0 0 1 1 0 1 Byte 4, 0xCD in Binär


7 7 0 2 3 3 0 7 Farbnummern in dezimal


Das lässt sich jetzt beliebig auch für die anderen Pixelreihen durchführen. Es sei wieder darauf hingewiesen, dass die Lesereihenfolge (also vertikal von oben nach unten oder andersrum) bzw. ob man die Bytes vertauschen muss (so wie in diesem Beispiel geschehen) vom System abhänging ist. Ebenfalls ist vom System abhängig, ob die 4 Bits für einen Pixel nicht hintereinander gespeichert werden etc. Das hier erklärte System ist übrigens das SMS-System.

Paletten

Grafikmodi unter 16bpp verwenden Paletten um eine höhere Farbtreue zu erreichen. Dagegen ist es bei Farbtiefen ab 16bpp sinnvoller, direkt die RGB-Werte anzugeben (mehr zu den Vor- und Nachteilen im Artikel über Paletten).

Wie RGB-Werte in einem Farbwert aufgebaut sind, hängt vom verwendeten System ab. Siehe dazu: RGB.

Beispiel:

Ein Farbwert in 16bpp könnte so aufgebaut sein: rrrrrggggggbbbbb
(jeder Buchstabe steht für ein Bit; alle Bits einer Farbe ergeben zusammen die Farbe.)

Hier kann man Rot von 0-31, Grün von 0-63 und Blau von 0-31 wählen.
Wenn alle Werte auf 0 stehen, hätte man Schwarz, bei R=31 G=63 B=31 hätte man weiß.
R=31 G=31 B=31 wäre hell-Magenta (da von Grün nur die Hälfte des maximal möglichen gesetzt ist).

Ein Grasgrün wäre z.B. 10001 110000 01010
Dort ist R=17/31 G=48/63 und B=9/31

(mehr zur Umrechnung von Farbwerten im Artikel RGB und in den spezifischen Systeminformationen.)

Siehe auch

'Persönliche Werkzeuge