Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 10:00

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Vertex Buffer + TileMap
BeitragVerfasst: Di Mai 14, 2013 08:22 
Offline
DGL Member

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)
Bild
und so sollte es aussehen:
Bild

Und das ist mein zugehöriges Tileset welches in 'this._tex' gespeichert ist
Bild

Hier einmal der Zeichencode:
Code:
  1.  
  2. this._tex.bind();
  3.  
  4. this._buf.pointTo(Buffer.Target.TexCoords);
  5. this._buf.pointTo(Buffer.Target.Vertex);
  6.  
  7. this._buf.drawArrays(GL_QUAD_STRIP);
  8.  


'this._buf' ist der Buffer und die PointTo Methoden sind die glVertexPointer bzw. glTexCoordPointer Aufrufe.

Meine Vertices und TexCoords werden folgendermaßen gesammelt:
Code:
  1. vertices ~= Vertex(vx, vy);      /// #1
  2. vertices ~= Vertex(vx + vw, vy); /// #2
  3. vertices ~= Vertex(vx, vy + vh); /// #3
  4. 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:
  1. texCoords ~= Vertex(tx / tsw,
  2.                     ty / tsh); /// #1
  3. texCoords ~= Vertex((tx + tw) / tsw,
  4.                     ty / tsh); /// #2
  5. texCoords ~= Vertex(tx / tsw,
  6.                     (ty + th) / tsh); /// #3
  7. texCoords ~= Vertex((tx + tw) / tsw,
  8.                     (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)

Das hier sind die ermittelten Textur Koordinaten (habe sie in eine Datei geleitet):
http://codepad.org/7cfMmw4o
und das hier die gesammelten Vertices:
http://codepad.org/tjSopHUR

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. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Di Mai 14, 2013 12:07 
Offline
DGL Member
Benutzeravatar

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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Di Mai 14, 2013 14:30 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich habe GL_QUAD_STRIP gewählt, weil man darauf noch am meisten erkennt.
Hier einmal was bei GL_TRIANGLES und GL_QUADS passiert:

Triangles:
Bild
Quads:
Bild

Liegt das an verkorksten Texture Koordinaten? Denn ich sehe im Grunde keinen Fehler bei diesen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Di Mai 14, 2013 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Vertausche mal Vertices 3 und 4.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Di Mai 14, 2013 17:16 
Offline
DGL Member

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:

Triangles:
Bild

und Quads:
Bild

Sieht immer noch leicht verwaschen aus. :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Di Mai 14, 2013 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Di Mai 14, 2013 22:18 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Stimmt, das war ein Problem.
Nun sieht es zwar "besser" aus, aber es gibt mir eigentlich nur noch mehr Rätsel auf:
Bild

Weiß jemand was das soll?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 00:47 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Gib mal nur das 1. Tile aus. Wenn das dann ordentlich aussieht das 2.,3. etc

Falls du schon Shader eingebaut hast, gib doch mal die Texturkoordinate als Farbe aus.

_________________
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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 06:36 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Bild
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):

Position:
[Vertex([0, 0, 0]), Vertex([16, 0, 0]), Vertex([16, 16, 0]), Vertex([0, 16, 0])]

Texture Koordinaten:
[1, 0, 2, 0, 1, 1, 2, 1]

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:
Bild

Sowie die folgenden Koordinaten:

Position (unverändert):
[0, 0, 0, 16, 0, 0, 16, 16, 0, 0, 16, 0, 16, 0, 0, 32, 0, 0, 32, 16, 0, 16, 16, 0, 0, 16, 0, 16, 16, 0, 16, 32, 0, 0, 32, 0, 16, 16, 0, 32, 16, 0, 32, 32, 0, 16, 32, 0]

Textur Koordinaten (nur ein Tile):
[0, 0.5, 0.5, 0.5, 0, 1, 0.5, 1]

Wenn ich das richtig sehe, müssten die Textur Koordinaten richtigerweise so lauten:
[0, 0, 0.5, 0, 0.5, 0.5, 0, 0.5]

oder?

edit3:
Selbst wenn ich sie manuell nach diesem Schema anlege, bleibt das Bild wie es ist, keine Veränderung...
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 13:26 
Offline
DGL Member
Benutzeravatar

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. :lol:

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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 14:21 
Offline
DGL Member

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 18:13 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
So ich habe nochmal etwas probiert:

Code:
  1.  
  2. Surface s = Surface("../../ts.png");
  3. Texture t = new Texture();
  4. t.loadFromMemory(s.getPixels(), s.width, s.height);
  5.  
  6.  
  7. Buffer vbo = new Buffer(Buffer.Target.Vertex | Buffer.Target.TexCoords);
  8.  
  9. float[] vData = [16, 16, 0, 32, 16, 0, 32, 32, 0, 16, 32, 0];
  10. float[] tData = [0, 0, 0.5, 0, 0.5, 0.5, 0, 0.5];
  11.  
  12. vbo.bind(Buffer.Target.Vertex);
  13. vbo.cache(vData.ptr, 4, vData.length * float.sizeof);
  14.  
  15. vbo.bind(Buffer.Target.TexCoords);
  16. vbo.cache(tData.ptr, 4, tData.length * float.sizeof);
  17.  


(die 4 ist der Parameter count bei glDrawArrays)

und

Code:
  1.  
  2. t.bind();
  3.  
  4. vbo.pointTo(Buffer.Target.TexCoords);
  5. vbo.pointTo(Buffer.Target.Vertex);
  6.  
  7. vbo.drawArrays(GL_TRIANGLES);
  8.  


Dadurch bekomme ich so etwas:
Bild

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:
Code:
  1.  
  2. float[] vData = [16, 16, 0, 32, 16, 0, 32, 32, 0, 16, 32, 0];
  3. float[] tData = [0, 0, 0, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0];
  4.  


sprich durch hinzunehmen der z Koordinaten für die Textur-Koordinaten, erhalte ich (wieder) so etwas:
Bild

Also Farbe stimmt, nur keine Grafik zusehen. Weiß jemand was da schief läuft? Ich weiß so langsam nicht mehr weiter.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 18:41 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Durch abändern der TexCoords zu dem hier:
Code:
  1. float[] tData = [0.5, 0.5, 0, 1, 0.5, 0, 1, 1, 0, 0.5, 1, 0];
  2.  

Und dem Wechsel des Tilesets zudem:
Bild

bekomme ich nun so eine Ausgabe:
Bild

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):
Code:
  1.  
  2. float[] vData = [16, 16, 0, 48, 16, 0, 48, 48, 0, 16, 48, 0];
  3. float[] tData = [0, 0, 1, 0, 1, 1, 0, 1];
  4.  

Man sollte meinen, dass der korrekt ist (und bei texCoords ist nichtmal eine z Koordinate)

Doch ich bekomme nur so etwas:
Bild

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 21:10 
Offline
DGL Member

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:
Bild

Also ganz korrekt können meine Textur Koordinaten noch nicht sein.

Hier sind die einmal sowie mein Weg diese zu generieren:

[0, 0.5, 0.5, 0.5, 0.5, 1, 0, 1, 0.5, 0, 1, 0, 1, 0.5, 0.5, 0.5, 0.5, 0, 1, 0, 1, 0.5, 0.5, 0.5, 0, 0.5, 0.5, 0.5, 0.5, 1, 0, 1]

Code:
  1.  
  2. texCoords ~= packtc(
  3.     tx / tsw,
  4.     ty / tsh); /// #1
  5.  
  6. texCoords ~= packtc(
  7.     (tx + tw) / tsw,
  8.     ty / tsh); /// #2
  9.  
  10. texCoords ~= packtc(
  11.     (tx + tw) / tsw,
  12.     (ty + th) / tsh); /// #4
  13.  
  14. texCoords ~= packtc(
  15.     tx / tsw,
  16.     (ty + th) / tsh); /// #3
  17.  


packtc packt sie nur in ein statisches float[3] array, um D's move Eigenschaft auszunutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Buffer + TileMap
BeitragVerfasst: Mi Mai 15, 2013 23:07 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
ich seh nur das dein erstes und viertes quad sowie das zweite und dritte identisch sind...

den punkt 0.0,0.0 zum beispiel fährst du nie an..

Code:
  1. [(0.0, 0.5), (0.5, 0.5), (0.5, 1.0), (0.0, 1.0)]
  2. [(0.5, 0.0), (1.0, 0.0), (1.0, 0.5), (0.5, 0.5)]
  3. [(0.5, 0.0), (1.0, 0.0), (1.0, 0.5), (0.5, 0.5)]
  4. [(0.0, 0.5), (0.5, 0.5), (0.5, 1.0), (0.0, 1.0)]


wie das sein kann versteh ich leider nicht :) weil ich durch die tx und tsw sache nicht durchblicke und auch kein c kann


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.025s | 17 Queries | GZIP : On ]