Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Hallo. Ich versuche mich nach langer Zeit wieder an OpenGL und versuche eine TileMap mithilfe eines Vertex Buffers zu realisieren. Leider sieht mein Ergebnis nicht ganz so aus, wie es aussehen sollte.
So sieht es aktuell aus (mit GL_QUAD_STRIP) und so sollte es aussehen:
Und das ist mein zugehöriges Tileset welches in 'this._tex' gespeichert ist
Hier einmal der Zeichencode:
Code:
this._tex.bind();
this._buf.pointTo(Buffer.Target.TexCoords);
this._buf.pointTo(Buffer.Target.Vertex);
this._buf.drawArrays(GL_QUAD_STRIP);
'this._buf' ist der Buffer und die PointTo Methoden sind die glVertexPointer bzw. glTexCoordPointer Aufrufe.
Meine Vertices und TexCoords werden folgendermaßen gesammelt:
Code:
vertices ~= Vertex(vx, vy); /// #1
vertices ~= Vertex(vx + vw, vy); /// #2
vertices ~= Vertex(vx, vy + vh); /// #3
vertices ~= Vertex(vx + vw, vy + vh); /// #4
(vx, vy sind die Koordinaten, vw und vh die Tilegrößen, in diesem Fall beide 16 Pixel) und
Code:
texCoords ~= Vertex(tx / tsw,
ty / tsh); /// #1
texCoords ~= Vertex((tx + tw) / tsw,
ty / tsh); /// #2
texCoords ~= Vertex(tx / tsw,
(ty + th) / tsh); /// #3
texCoords ~= Vertex((tx + tw) / tsw,
(ty + th) / tsh); /// #4
(tx, ty sind die Koordinaten, tw und th die Tilegrößen, wie oben schon beschrieben und tsw sowie tsh sind die Breite/Höhe des Tilesets) (~= heißt soviel wie append; Der Code ist D)
Meine Frage ist eigentlich: sieht jemand auf die schnelle einen groben Schnitzer oder weiß jemand ob es an Texturkoordinaten oder Vertices liegt? Ich habe schon viel herumprobiert, aber irgendwie komm ich nicht drauf. Wäre nett wenn mir jemand einen Tipp geben könnte. Vielen Dank im voraus.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Ich würde mal behaupten, dass es mit GL_QUAD_STRIP nicht funktionieren kann, da jedes Tile ja 4 Vertices haben muss um die Texturkoordinaten für alle 4 Ecken zu definieren. Beim STRIP teilen sich aber zwei Tiles zwei Vertices.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Das habe ich auch eben durch herumprobieren mit anderen Daten rausbekommen. Habe jetzt Vertex 3 und 4 sowie TexCoord 3 und 4 getauscht. Dann sieht das ganze folgendermaßen aus:
So, bei Quads hast du nun zumindest auch Quads, d.h. du musst nur noch die Texcoord fixen. Merkwürdig kommt mir vor das deine Ausgabe der Texturkoordinaten einen 3D-Vertex ausgibt, obwohl du ja nur 2D-Texturkoordinaten benutzt. Schreibst du da also vielleicht zuviel Daten in den Buffer, so das die 0 der Z-Koordinate beim X für den nächsten Vertex landet?
Edit: Deine Texturkoordinaten enthalten für X und Y jeweils 0, 0.5 und 1. Da kann was nicht stimmen, da deine Tiletextur ja quadratisch ist und nur zwei Tiles im oberen Bereich hat. Jenachdem ob deine Textur beim laden gespiegelt wird oder nicht sollte da für Y ein Bereich von entweder 0 bis 0.5 oder 0.5 bis 1 rauskommen.
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
So sieht ein Tile aus. Es ist grün, aber das war's auch schon. In keinster Weise als die Grafik zu erkennen, die es sein sollte. Und nein, mit Shadern arbeite ich hierbei nicht.
edit: Okay, zwei oder drei Tiles ausgeben funktioniert nicht so gut. Und ein Blick auf die Koordinaten verrät, dass da auch was nicht stimmen kann (wenn ich mich nicht völlig irre):
Wie zum Henker diese 2 da rein kommt, muss ich mal nachgucken. o.O
edit2: Ok, die 2 kommt daher, dass ich beide Durchgänge nach dem ersten Durchlauf abgebrochen habe um nur jeweils die Position / Texturkoordinaten eines Tiles habe. Dadurch war mein Tileset nur 16x16 groß (ein Tile eben) und beim berechnen der Textore Koordinaten verfahre ich ja mit (tx + tw) / tsw, und bei Position 16 und Größe 16 sowie einer Tileset Größe von 16 macht das (16 + 16) / 16 was eben 2 ergibt. Aber auch ein anpassen dieser Koordinaten auf richtige Werte hat das Bild nicht verändert, was komisch ist. Zur absoluten Sicherheit bin ich jetzt einmal Testweise auf ein normales float array übergegangen, anstelle der Vertex struct, doch das Bild hat sich kein bisschen verändert, schwarzer Streifen oben, grüner unten.
Breche ich jetzt aber nur die Erzeugung der Textur Koordinaten (und nicht auch die der Vertices) nach dem ersten Durchlauf ab, erhalte ich das hier:
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Vielleicht hilft es dir wenn ich mal schildere wie ich in meiner Engine die Texturkoordinaten für die Tiles berechne:
Meine Tilemap hat 16x16 Tiles also 256 Texturen. In den Daten für jedes Tile wird nur ein Byte gespeichert. z.B. 20 Mittels Division und Modulo errechne ich aus dem Byte die Position in der Tilemap. Im Beispiel: y = 20 / 16 ~ 1 und x = 20 % 16 ~ 4.
Meine Quad Klasse zeichnet standardmäßig mit Texturkoordinaten im Bereich von 0 - 1 bietet aber Funktionen um alle 4 Koordinaten zu Skalieren und zu Verschieben. Also dividiere ich zuerst durch die Anzahl der Tiles. Ergibt dann 1/16tel. (Skalieren auf die richtige Größe) Anschliessend einfach das Vielfache von 1/16 und der Position in der Tilemap draufaddieren. (Verschieben an die richtige Position) xOffset = 1 * (1 / 16); yOffset = 4 * (1 / 16);
Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.
PS: (1 / 16) habe ich einfach als Konstante definiert, da ich wahrscheinlich nie mehr als 256 Texturen brauchen werde.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Genauso berechne ich mir meine Textur Koordinaten. Ich mache aber noch mehr: Zu aller erst lese ich das benötigte Tileset ein, dann schneide ich die Tiles aus dem Tileset heraus, die ich wirklich benötigte und bastel diese zu einem neuen Tileset zusammen. Und dieses neue (kleinere) Tileset verwende ich dann. Und das erstellen funktioniert ja auch, aber komischerweise bekomme ich völlig verkorkste Texturkoordinaten.
Was mich am meisten wundert: selbst wenn ich per Hand die (meiner Meinung nach) richtigen Koordinaten eintrage in den Buffer, bekomme ich trotzdem nicht das Bild, sondern nur eine Grüne Fläche. Da frage ich mich halt: wieso bekomme ich nur die Farbe des Tiles aber nicht das Tile an sich, sprich: die Grafik?
Ist zwar nur eine Linie aber es sieht aus, als könnten es korrekte Grafik Ausschnitte sein. Tileset ist immer noch wie oben angegeben, nur das ich den schwarze Hintergrund transparent gemacht habe.
(Funktioniert auch wirklich nur mit GL_TRIANGLES, bei GL_QUADS sehe ich nichts.)
edit: Durch abändern der Koordinaten auf diese hier:
zumindest mal ansatzweise Grafik. Aber da ist voll der Wurm drin.
edit: Mein letzter Versuch war es nun, einfach die komplette Grafik zu binden und anzuzeigen. Dazu habe ich die folgenden Koordinaten benutzt (wenn jmd. einen Fehler sieht, sofort schreien):
Man sollte meinen, dass der korrekt ist (und bei texCoords ist nichtmal eine z Koordinate)
Doch ich bekomme nur so etwas:
Jetzt weiß ich wirklich nicht mehr weiter. Wenn ich die Textur (also das Tileset) einfach rendere, sehe ich sie ganz normal wie es sein soll.
edit2: Was auch noch recht interessant ist: Benutze ich gar nichts ODER glColor3f(1, 1, 1); sehe ich das gepostete Bild da oben. Benutze ich aber z.B. glColor3f(1, 0, 0);, dann ist mein Quadrat einfach Rot, trotz binden der Textur.
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Nun ist es geschafft. Das Problem war, dass bei glTexCoordPointer anstelle von 2, eine 4 stand... Blöder Fehler, bis man den mal gefunden hat. Er zeichnet mir jetzt wie vorgesehen meine Map. Danke für die Hilfe!
edit: Etwas zu früh gefreut, ich bekomme nur so etwas:
Also ganz korrekt können meine Textur Koordinaten noch nicht sein.
Hier sind die einmal sowie mein Weg diese zu generieren:
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.