[OpenGL] Texture Wrap Mode für einzelne Primitives
Verfasst: 11.10.2015, 20:36
Hallo ich stehe gerade etwas auf dem Schlauch. Ich bin leider auch nicht der Vollblutprofi was Grafikprogrammierung angeht.
Was tue ich?
Ich zeichne mit OpenGL eine tile-based map aus einem Textureatlas (große Textur, die alle Tiles enthält). Ich verwende zwei VBO, eins für die Vertexdaten und eins für die Texturkoordinaten. Am Ende wird alles mit DrawArrays auf den Schirm gezaubert. So weit so gut.
Mein Problem:
Ich möchte nun auch Teile von Tiles anzeigen. Grundlegend die 4 Quadranten. Also z.B. nur den oberen linken Abschnitt. Das bekomme ich noch über die Texturkoordinaten hin. Nun möchte ich allerdings auch ermöglichen, dass der obere linke Teil 2 mal nebeneinander angezeigt wird. Also quasi eine Wiederholung eines Tile-Teils. Das würde prinzipiell gehen, wenn ich GL_TEXTURE_WRAP_S bzw. GL_TEXTURE_WRAP_T auf GL_REPEAT setze. Der Haken an der Sache ist, dass ich diesen Wert nur global setzen kann und nicht spezifisch für eine Anzahl von Vertices bzw. Primitives (ich nutze ja DrawArrays). Oder gibt es da eine Möglichkeit?
Was will ich erreichen?
Im Prinzip soll der Anwender nicht nur Tiles befüllen können sondern pro Tile noch weitere Dinge festlegen können:
- X-Offset bzw. Y-Offset innerhalb des Tiles (-half tile size, 0, +half tile size)
- Breite und Höhe innerhalb des Tiles (half tile size oder full tile size)
- Repeat des Tile-Teils (falls kein Voll-Tile)
- Spiegeln an X- und Y-Achse (für Voll-Tile oder Tile-Teil)
Tiles können dann auch Leerraum enthalten. Wenn z.B. Repeat aus ist und die Breite/Höhe nur eine halbes Tile beträgt.
Lösung?
Wahrscheinlich versuche ich das einfach auf dem falschen Weg zu lösen. Hab auch schon Shader probiert, aber da komme ich auch nicht wirklich weiter und ich glaube auch nicht, dass die da gut geeignet sind.
Also die Lösung müsste Teile eines Tiles (welches wiederum Teil eines Tileatlas ist) beliebig innerhalb eines Tiles platzieren, wiederholen und auch spiegeln können. Das meiste geht über Texturkoordinaten, aber halt die Einstellung für die Wiederholung nicht.
Kann mir da wer helfen?
Wäre schön wenn ich dafür nicht die Grafik selbst anpassen muss oder Tiles als EInzelgrafiken verarbeiten muss.
Die einzige Lösung, die mir einfällt, wäre alle 4 Quadranten eines Tiles separat als Primitive zu zeichnen. Das vervierfacht aber die Daten und ich würde das gern vermeiden wenn möglich. Zumal ich fürs Repeat dann selbst noch Logik einbauen muss, obwohl es dafür schon ein OpenGL-Feature gibt.
Was tue ich?
Ich zeichne mit OpenGL eine tile-based map aus einem Textureatlas (große Textur, die alle Tiles enthält). Ich verwende zwei VBO, eins für die Vertexdaten und eins für die Texturkoordinaten. Am Ende wird alles mit DrawArrays auf den Schirm gezaubert. So weit so gut.
Mein Problem:
Ich möchte nun auch Teile von Tiles anzeigen. Grundlegend die 4 Quadranten. Also z.B. nur den oberen linken Abschnitt. Das bekomme ich noch über die Texturkoordinaten hin. Nun möchte ich allerdings auch ermöglichen, dass der obere linke Teil 2 mal nebeneinander angezeigt wird. Also quasi eine Wiederholung eines Tile-Teils. Das würde prinzipiell gehen, wenn ich GL_TEXTURE_WRAP_S bzw. GL_TEXTURE_WRAP_T auf GL_REPEAT setze. Der Haken an der Sache ist, dass ich diesen Wert nur global setzen kann und nicht spezifisch für eine Anzahl von Vertices bzw. Primitives (ich nutze ja DrawArrays). Oder gibt es da eine Möglichkeit?
Was will ich erreichen?
Im Prinzip soll der Anwender nicht nur Tiles befüllen können sondern pro Tile noch weitere Dinge festlegen können:
- X-Offset bzw. Y-Offset innerhalb des Tiles (-half tile size, 0, +half tile size)
- Breite und Höhe innerhalb des Tiles (half tile size oder full tile size)
- Repeat des Tile-Teils (falls kein Voll-Tile)
- Spiegeln an X- und Y-Achse (für Voll-Tile oder Tile-Teil)
Tiles können dann auch Leerraum enthalten. Wenn z.B. Repeat aus ist und die Breite/Höhe nur eine halbes Tile beträgt.
Lösung?
Wahrscheinlich versuche ich das einfach auf dem falschen Weg zu lösen. Hab auch schon Shader probiert, aber da komme ich auch nicht wirklich weiter und ich glaube auch nicht, dass die da gut geeignet sind.
Also die Lösung müsste Teile eines Tiles (welches wiederum Teil eines Tileatlas ist) beliebig innerhalb eines Tiles platzieren, wiederholen und auch spiegeln können. Das meiste geht über Texturkoordinaten, aber halt die Einstellung für die Wiederholung nicht.
Kann mir da wer helfen?
Wäre schön wenn ich dafür nicht die Grafik selbst anpassen muss oder Tiles als EInzelgrafiken verarbeiten muss.
Die einzige Lösung, die mir einfällt, wäre alle 4 Quadranten eines Tiles separat als Primitive zu zeichnen. Das vervierfacht aber die Daten und ich würde das gern vermeiden wenn möglich. Zumal ich fürs Repeat dann selbst noch Logik einbauen muss, obwohl es dafür schon ein OpenGL-Feature gibt.