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

Aktuelle Zeit: Fr Apr 19, 2024 00:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Merkwürdige Verzerrungen
BeitragVerfasst: Fr Mai 15, 2015 21:56 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Zunächst einmal: habt ihr Probleme mit googlemail Adressen? :P Ich hatte mein Passwort vergessen und saß seit gestern dran es wieder zu finden. Die Passwort Recovery funktionierte nicht und eine Neu-Registrierung über eine googlemail Adresse schlug mit dem Hinweis fehl "Zuviele Spambots mit diesen Adressen". :shock:

Naja, ich habe (mal wieder) eine kleine Frage. :)

Und zwar arbeite ich gerade wieder mal (seit langem) mit OpenGL. Dabei rendere ich eine kleine TileMap und das ganze sieht folgendermaßen aus:
Bild
Da ich aber für jedes Teil zunächst einen Draw Call hatte, wollte ich alle Calls zusammenfassen und habe mir alle Vertices in ein zusammenhängendes Array geschrieben. Das ganze ist auch beinahe 30% schneller, aber es kommt zu einem Problem:
Bild
Ich sehe derartige Verzerrungen. Der Code ist korrekt und auch die Daten die ich mir natürlich habe ausprinten lassen sind alle ok (keine komischen floats). Hier einmal zur Ansicht:
https://gist.github.com/Dgame/5f4d2a47efaa6007c98b

Ein Vertex hat zunächst eine Position in Pixel, dann die Texture-Koordinaten und anschließend eine Farbe (hier weiß). Und wie man sehen kann: keine komischen float Ausreißer. Weiß jemand woran es liegen kann? Oder welche Gründe so etwas haben kann?
Als Primitive gebe ich GL_TRIANGLE_STRIP an, ich habe aber bereits die meisten anderen durch (von GL_QUADS über GL_QUAD_STRIP zu GL_TRIANGLE_FAN). Vielleicht bemerkt ja jemand etwas was ich nicht bemerke.

Hier einmal der Code wie ich ein Tile hinzufüge:
Code:
  1.  
  2.     /**
  3.      * Appends four Vertices arounds the given position with the given texture coordinates
  4.      */
  5.     void append()(auto ref const Vector2f position, auto ref const Rect texRect) pure nothrow {
  6.         immutable float tx = float(texRect.x) / _texture.width;
  7.         immutable float ty = float(texRect.y) / _texture.height;
  8.         immutable float tw = float(texRect.width) / _texture.width;
  9.         immutable float th = float(texRect.height) / _texture.height;
  10.  
  11.         immutable float tx_tw = tx + tw;
  12.         immutable float ty_th = ty + th;
  13.         immutable float cx_tw = position.x + texRect.width;
  14.         immutable float cy_th = position.y + texRect.height;
  15.  
  16.         _vertices.reserve(4);
  17.  
  18.         _vertices ~= Vertex(
  19.             position,
  20.             Vector2f(tx, ty),
  21.             Color4f.White
  22.         );
  23.  
  24.         _vertices ~= Vertex(
  25.             Vector2f(cx_tw, position.y),
  26.             Vector2f(tx_tw, ty),
  27.             Color4f.White
  28.         );
  29.  
  30.         _vertices ~= Vertex(
  31.             Vector2f(position.x, cy_th),
  32.             Vector2f(tx, ty_th),
  33.             Color4f.White
  34.         );
  35.  
  36.         _vertices ~= Vertex(
  37.             Vector2f(cx_tw, cy_th),
  38.             Vector2f(tx_tw, ty_th),
  39.             Color4f.White
  40.         );
  41.     }
  42.  


Ich wurde dann darauf hingewiesen, dass es vllt nicht an den eigentlichen Daten liegen muss, sondern darin, wie ich sie erhalte. Also hab' ich mir auch das angesehen. Es ist sehr simpel und recht primitiv und deswegen eig. leicht überschaubar und mir fielen keine Fehler auf:
Code:
  1.  
  2.     enum ubyte MAP_WIDTH = 12;
  3.     enum ubyte MAP_HEIGHT = 10;
  4.  
  5.     enum ubyte TILE_SIZE = 32;
  6.  
  7.     // 0 = empty, a = start, t = tile, z = target
  8.     const char[MAP_WIDTH * MAP_HEIGHT] Tiles = [
  9.         '0', 'a', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
  10.         '0', 't', 't', 't', 't', 't', '0', '0', 't', 't', 't', '0',
  11.         '0', '0', '0', 't', 't', 't', 't', '0', '0', '0', '0', '0',
  12.         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
  13.         't', 't', '0', '0', '0', '0', 't', 't', 't', 't', '0', 't',
  14.         '0', '0', '0', '0', '0', 't', 't', 't', '0', '0', 't', 't',
  15.         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
  16.         '0', 't', 't', 't', 't', '0', '0', '0', '0', '0', '0', '0',
  17.         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'z',
  18.         '0', '0', '0', 't', 't', 't', 't', 't', 't', 't', 't', 't',
  19.     ];
  20.  
  21.     Texture tile_tex = Texture(Surface("Tile.png"));
  22.  
  23.     Vector2f start, target;
  24.  
  25.     VertexArray va = new VertexArray(tile_tex);
  26.  
  27.     ubyte x, y;
  28.     foreach (ubyte idx, char c; Tiles) {
  29.         if (Tiles[idx] == 't') {
  30.             va.append(Vector2f(x * TILE_SIZE, y * TILE_SIZE));
  31.         } else if (Tiles[idx] == 'a')
  32.             start = Vector2f(x * TILE_SIZE, y * TILE_SIZE);
  33.         else if (Tiles[idx] == 'z')
  34.             target = Vector2f(x * TILE_SIZE, y * TILE_SIZE);
  35.  
  36.         x++;
  37.         if (x >= MAP_WIDTH) {
  38.             x = 0;
  39.             y++;
  40.         }
  41.     }
  42.  


Ich sehe zumindest keinen (offensichtlichen) Fehler. Sieht jemand etwas das ich nicht sehe?

Vielen Dank im voraus für jedwede Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Merkwürdige Verzerrungen
BeitragVerfasst: Sa Mai 16, 2015 09:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Mit Triangle Strip musst du entweder Primitive Restart verwenden oder degenerierte Dreiecke einfügen, wenn du so rendern willst, wie du das gerade tust.

Im Moment legst du ja Quad-Artige Strukturen an; eigentlich sollten diese mit GL_QUADS tatsächlich auch funktionieren, wenn das nicht der Fall ist, zeig mal, was da schief geht. Wenn man Quad-artige Strukturen mit GL_TRIANGLE_STRIP rendert, dann kann so etwas wie bei dir herauskommen.

Ich würde als optimalen Zwischenweg empfehlen, GL_TRIANGLE_STRIP mit Primitive Restart oder GL_TRIANGLES zu verwenden. Dafür musst du natürlich deine Vertexdaten entsprechend anpassen.

viele Grüße,
Horazont

p.s.: Ich bin mir nicht sicher, ob und auf welcher Ebene hier ein Verständnisproblem vorliegt; wenn etwas unklar ist, frag bitte nach.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Merkwürdige Verzerrungen
BeitragVerfasst: Sa Mai 16, 2015 10:37 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Wenn du die Sache beschleunigen willst, verwende einen Index- und Vertexbuffer, der Immediate Mode ist eh längst veraltet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Merkwürdige Verzerrungen
BeitragVerfasst: So Mai 17, 2015 00:18 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Lord Horazont hat geschrieben:
Mit Triangle Strip musst du entweder Primitive Restart verwenden oder degenerierte Dreiecke einfügen, wenn du so rendern willst, wie du das gerade tust.

Im Moment legst du ja Quad-Artige Strukturen an; eigentlich sollten diese mit GL_QUADS tatsächlich auch funktionieren, wenn das nicht der Fall ist, zeig mal, was da schief geht. Wenn man Quad-artige Strukturen mit GL_TRIANGLE_STRIP rendert, dann kann so etwas wie bei dir herauskommen.

Ich würde als optimalen Zwischenweg empfehlen, GL_TRIANGLE_STRIP mit Primitive Restart oder GL_TRIANGLES zu verwenden. Dafür musst du natürlich deine Vertexdaten entsprechend anpassen.

viele Grüße,
Horazont

p.s.: Ich bin mir nicht sicher, ob und auf welcher Ebene hier ein Verständnisproblem vorliegt; wenn etwas unklar ist, frag bitte nach.

Das hat mir wirklich sehr weitergeholfen, scheinbar stand ich wieder auf einer langen Leitung. Mit GL_QUADS bzw. GL_QUAD_STRIP sieht das ganze folgendermaßen aus:

GL_QUADS:
Bild

GL_QUAD_STRIP
Bild

wenn ich den letzten und den vorletzten Vertex-Eintrag tausche, dann klappt es auch mit GL_QUADS. Wundere mich nur, dass GL_QUAD_STRIP Probleme bereitet. Weißt du warum? [edit: ich schätze, weil ich Lücken zwischen den Quads habe, stimmt's? ;)]
Jedenfalls schon einmal vielen Dank. Inwiefern müsste ich denn meine Vertices ändern, damit ich GL_TRIANGLE_STRIP / GL_TRIANGLES _ohne_ Primitive Restart verwenden kann? Oder ist das nicht möglich?


Zuletzt geändert von rswhite am So Mai 17, 2015 00:26, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Merkwürdige Verzerrungen
BeitragVerfasst: So Mai 17, 2015 00:22 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
OpenglerF hat geschrieben:
Wenn du die Sache beschleunigen willst, verwende einen Index- und Vertexbuffer, der Immediate Mode ist eh längst veraltet.

Ich wollte für die kleine Mengen eig. keinen VBO benutzen, IMO wäre das "Mit Kanonen auf Spatzen schießen". Aber ich lasse mich gerne eines besseren belehren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Merkwürdige Verzerrungen
BeitragVerfasst: So Mai 17, 2015 02:32 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Zitat:
Ich wollte für die kleine Mengen eig. keinen VBO benutzen, IMO wäre das "Mit Kanonen auf Spatzen schießen". Aber ich lasse mich gerne eines besseren belehren.

Quark, VBO's sind Standard, um spaetestens ab OpenGL 3 Sachen zu rendern. Dein Grafiktreiber emuliert das ganze veraltete Immediatezeug ansonsten eh mittels VertexArrays oder so.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Merkwürdige Verzerrungen
BeitragVerfasst: So Mai 17, 2015 11:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
rswhite hat geschrieben:
Wundere mich nur, dass GL_QUAD_STRIP Probleme bereitet. Weißt du warum? [edit: ich schätze, weil ich Lücken zwischen den Quads habe, stimmt's? ;)]
Jedenfalls schon einmal vielen Dank. Inwiefern müsste ich denn meine Vertices ändern, damit ich GL_TRIANGLE_STRIP / GL_TRIANGLES _ohne_ Primitive Restart verwenden kann? Oder ist das nicht möglich?

Jau, genau, QUAD_STRIP verbindet halt die Quads, analog zu TRIANGLE_STRIP.

Wenn du Primitive Restart nicht verwenden willst, nimm einfach TRIANGLES. Für TRIANGLES musst du lediglich deine Vertices so anpassen, dass deine Quads aus jeweils zwei Dreiecken zusammengesetzt werden. Wenn deine Quads also so aussehen:
Code:
  1. 0  3
  2. 1  2

Dann baust du folgende Vertices für zwei Dreiecke:
Code:
  1. 0/   2/0
  2. 1/1   /2

Auf der linken Seite des Schrägstriches sind die Punkte für das erste und auf der rechten Seite des Schrägstrichs die Punkte für das zweite Dreieck.

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Merkwürdige Verzerrungen
BeitragVerfasst: Mi Mai 20, 2015 08:21 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ah, das guck ich mir mal an, vielen Dank!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 16 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.050s | 18 Queries | GZIP : On ]