Manchmal, wenn man einfach nur mal eben einen Grafiktest machen will, oder auch generell falls eine Content Datei fehlt steht man immer vor der Frage: was macht man? Sucht man sich irgendwoher eine kleine Textur zum testen raus, oder lässt man das Spiel abstürzen wenn der Content fehlt?
Die Lösung lautet CheckerMap, oder aber die “Notfalltextur”.
Hierbei handelt es sich um eine zur Laufzeit generierte, 4×4 Pixel große Schachbrettmuster-Textur, welche fehlende Bilddaten zum testen ersetzten kann.
Meist benutzt man dazu einfaches Grau und Silber. Das Schachbrettmuster daher, damit man z.b. die UV-Koordinaten, oder Übergänge auch mit der Testtextur erkennen kann.
In diesem Beispiel wollen wir die CheckerMap mit Hilfe des XNA-Frameworks erstellen.
Da die Textur keinerlei Alpha oder besondere Farbenvielfalt benötigt, können wir zusätzlich die Texturgröße im Speicher ziemlich gering halten. Benutzen tun wir das Bildformat Bgr565, welches 5 bits für blau und rot verwendet und 6 bits für den grünen Kanal. Demnach benötigen wir pro Pixel nur 16 bits, wodurch wir perfekt den ushort Datentyp verwenden können. Für das “Silber” verwenden wir dann den ushort Wert “38034″ und für das “Grau” den Wert “12678″.
Aber nun zum Code:
1 | Texture2D texture = new Texture2D(GraphicsDevice, 4, 4, false, SurfaceFormat.Bgr565); |
Texture2D texture = new Texture2D(GraphicsDevice, 4, 4, false, SurfaceFormat.Bgr565);
Dieser Einzeiler erstellt uns eine neue Instanz von Texture2D welche 4×4 Pixel groß ist, keine Mipmaps generiert (was bei der CheckerMap unnötig wäre) und das Format Bgr565 für die Daten benutzt.
Aber noch haben wir eine leere Textur, deshalb füllen wir sie nun mit unserem Schachbrettmuster. Dafür speichern wir uns erst einmal unsere zwei Pixel-UShorts:
1 2 | ushort silver = 38034; ushort gray = 12678; |
ushort silver = 38034; ushort gray = 12678;
und füllen jetzt die Textur:
1 2 3 4 5 6 7 | texture.SetData<ushort>(new ushort[] { gray, silver, gray, silver, silver, gray, silver, gray, gray, silver, gray, silver, silver, gray, silver, gray, }); |
texture.SetData<ushort>(new ushort[]
{
gray, silver, gray, silver,
silver, gray, silver, gray,
gray, silver, gray, silver,
silver, gray, silver, gray,
});Und schon haben wir eine wunderschöne, naja zweckmäßige, Textur falls es mal schnell gehen soll. Wenn man eine eigene kleine Engine schreibt ist es hilfreich diese Hilfstextur direkt darin zu intergrieren, damit man sie immer ohne große Umschweife zur Verfügung hat.
Eine wichtige Sache abschließend wäre noch das Filtering der Textur! Da es nur 4×4 Pixel sind wird die Textur in fast allen Fällen skaliert. Dadurch wird die Textur bei Standardshadern schnell schwammig und verliert das Schachbrettmuster. Daher ist es wichtig immer für diese Textur den MinFilter und MagFilter auf Nearest zu stellen. Somit ist das Muster in jeder Größe garantiert.