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

Aktuelle Zeit: Sa Jul 05, 2025 09:12

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Tiled Map lädt nicht richtig
BeitragVerfasst: So Jun 15, 2014 18:58 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Hallo,

bei mir hat ein Tile eine Größe von 32x32 Pixel. Wie schon oben geschrieben, dupliziere ich einfach die Randpixel. Der Textur-Atlas hat eine Größe von 512x512 Pixel. Im Spiel werden die Tiles wie auf einem Schachbrett gesetzt. Soweit funktioniert das ganze auch gut. Allerdings entstehen beim vertikalen Scrollen ab und zu horizontale Linien zwischen den Tiles und beim horizontalen Scrollen entstehen ab und zu vertikale Linien zwischen den Tiles. Je nachdem, welches Tileset ich verwende, fällt es mehr oder weniger auf.

Ich habe nun schon alles mögliche ausprobiert. Wenn ich den MIN und MAG Filter auf GL_NEAREST stelle, hat man den Eindruck, dass die kompletten Tiles beim Scrollen in der entsprechenden Richtung "wackeln". Setze ich den MIN und MAG Filter jeweils auf GL_LINEAR sind es jeweils nur die die Ränder der Tiles, die "wackeln" (beim Scrollen nach oben und unten ist es der obere und der untere Rand).

Ich dachte nun, dass es an meinem Textur-Atlas liegt. Wenn ich für jedes Tile eine eigene Textur verwende, tritt das Phänomen jedoch auch auch.

Hier mein Code zum Zeichnen der Tiles:
Code:
  1.  
  2. Procedure DrawQuad(pX, pY, pZ, pWidth, pHeight : Single; X,Y:Integer);
  3. Const TileSize=32;     //Breite und Höhe eines Tiles
  4.       TileSetSize=512; //Breite und Höhe des Tilesets
  5. Var FV:Single;  //Fix Value
  6.  
  7.     XLeft,XRight:Single;
  8.     YTop,YBot:Single;
  9. Begin
  10.  
  11. FV:=0; //Oder FV 0.5/TileSetSize;
  12.  
  13. XLeft:=(2+TileSize)*X+1;
  14. XRight:=(2+TileSize)*(X+1)-1;
  15. YTop:=(2+TileSize)*Y+1;
  16. YBot:=(2+TileSize)*(Y+1)-1;
  17.  
  18. //Auf Textur umrechnen
  19.  
  20. XLeft:=XLeft/TileSetSize;
  21. XRight:=XRight/TileSetSize;
  22. YTop:=YTop/TileSetSize;
  23. YBot:=YBot/TileSetSize;
  24.  
  25.  glTexCoord2f(XLeft +FV,YBot -FV); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ); //Links unten
  26.  glTexCoord2f(XRight -FV,YBot-FV); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ); //Rechts unten
  27.  glTexCoord2f(XRight -Fv,YTop+FV); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ); //Rechts oben
  28.  glTexCoord2f(XLeft+FV,YTop+FV); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ);  //Links oben
  29.  
  30. End;
  31.  


Das Setzen von FV:=0.5/512 bringt nichts.

Hat jemand von Euch eine Idee, woran das liegen könnte oder ist das normal? Wie schon geschrieben tritt das ganze nur beim Scrollen auf.

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tiled Map lädt nicht richtig
BeitragVerfasst: Mo Jun 16, 2014 14:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 05, 2013 15:12
Beiträge: 167
Wohnort: Glinde
Programmiersprache: Delphi 7
Es könnte ja sein... "Spannungsbogen aufbauen" ...wenn dein problem nur beim scrollen auftritt, das es eventuell am Aufruf selber liegt.

Angenommen *nicht das es bei mir genauso war hust* dein Spiel rendert die Spielwelt.
Deine Ansicht(Kamera) steht auf X,Y position. Jetzt bewegst du noch bevor die Spielwelt komplett gerendert ist die Kamera. Und schon rendert der nächste Drawbefehl mit einer verschiebung die neue Position.
So können auch Linien entstehen.

In diesem Fall empfehle ich dir, die Bildschirm Koordinaten für den gesamten Rendervorgang vorher fest einzustellen.
Also sozusagen die Rahmenbedingungen des Rendervorganges.

begin
JetzigepositionX:=Client.weite;
JetzigepositionY:=Client.höhe;

renderschleife etc
end;

G Polar

_________________
幸福は笑う人に来て ~~ koufuku wa warau hito ni kite
Das Glück kommt zu denen die lachen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tiled Map lädt nicht richtig
BeitragVerfasst: Mo Jun 16, 2014 15:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Polarwolf hat geschrieben:
Deine Ansicht(Kamera) steht auf X,Y position. Jetzt bewegst du noch bevor die Spielwelt komplett gerendert ist die Kamera. Und schon rendert der nächste Drawbefehl mit einer verschiebung die neue Position.
Das kann nur passieren, wenn die Kamera innerhalb der Renderschleife verändert wird. Oder ich habe irgendwas an OpenGL grundlegend falsch verstanden…

grüße

_________________
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: Tiled Map lädt nicht richtig
BeitragVerfasst: Mo Jun 16, 2014 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 05, 2013 15:12
Beiträge: 167
Wohnort: Glinde
Programmiersprache: Delphi 7
Lord Horazont hat geschrieben:
Das kann nur passieren, wenn die Kamera innerhalb der Renderschleife verändert wird. Oder ich habe irgendwas an OpenGL grundlegend falsch verstanden…


Oh, das wusst ich nicht.
Aber warum sollten ausgerechnet (und nur dann) beim scrollen Linien entstehen.

Nagut, wenn man beim Scrollen keine kompletten Pixel bewegt und die Kamera sich um halbe oder weniger Pixel verändert, kann sie sich verrechnen. Oder ?

G Polar

_________________
幸福は笑う人に来て ~~ koufuku wa warau hito ni kite
Das Glück kommt zu denen die lachen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tiled Map lädt nicht richtig
BeitragVerfasst: Mo Jun 16, 2014 18:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich vermute auch, dass es was mit Rundungsproblemen beim abbilden der Vertexkoordinaten auf Pixel/Fragments zu tun hat, aber ich hab noch keine konsistente Idee dazu.

Ist Antialiasing an (wenn ja -> ausschalten)?

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: Tiled Map lädt nicht richtig
BeitragVerfasst: Mo Jun 16, 2014 18:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Linien können auch entstehen, wenn die Primitive nicht in einem Rutsch gerendert werden und durch fehlende Informationen zur Geometry und der Präzisions des Tiefenpuffer sowie Rasterizer Löcher im Mesh entstehen.
Ich denke mal, dass du Löscher aufgrund der Präzision von floatingpoint hast und deine Tiles nicht über Indexliste renderst.

Wenn man bei floatingpoint in zu große vorkomma Werte kommt, dann wird das ziemlich schnell ziemlich ungenau.
Üblicherweise tut man bei größeren Welten die Umgebung auf die Kamera um rechnen und ein Spatial System verwenden.
Sollte man z.B. 32091,39 haben, dann wird jede berechnung damit extrem ungenau und wenn man dann noch die Vertices einzelnen berechnet, statt über Indizes wieder zu verwenden, dann haben die vertices unterschiedliche Positionen und das geht dann entsprechend schief.
Wenn man seine Kamera von Oben und Ortho nur auf x und z Achse bewegt, entstehen die Linien auf von linken bis rechten Rand bzw. Vertikal.

Erster Test wäre zu gucken wie große deine Positionen sind und entsprechend mal mit scale alles zu verkleinern und zu prüfen ob es verschwindet.
Passiert dies bei 0,0,0 nicht aber weiter Weg, dann benötigst du ein Spatial System, welches deine Welt in Zellen zerlegt und die Meshes in relation zu den Zellen setzt, damit bleiben die Positionen sehr klein und eine Matrix transformation zum rendern macht auch weniger Fehler.
Dabei sollte man auch die Kamera Position vorher mit der Position von den Zellen subtrahieren/addieren, um nah wie möglich an 0,0,0 mit der Translation zu kommen.

Wenn du noch keine Indizes benutzt, dann solltest du diese verwenden, da Rundungsfehler bei Quad-Tiles geteilt werden statt jeder Tile sie für sich selbst macht.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tiled Map lädt nicht richtig
BeitragVerfasst: Mo Jun 16, 2014 19:41 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Danke für die Antworten :)

Ich habe das Verhalten beim Scrollen Pixel für Pixel beobachtet (bei Tastendruck wird einfach um ein Pixel in die entsprechende Richtung gescrollt).

Beim vertikalen Scrollen nach oben nimmt beim unteren Randpixel von der "Ausgangshöhe" stufenweise die Höhe ab und springt anschließend in die "Ausgangshöhe" zurück. Beim oberen Randpixel nimmt von der "Ausgangshöhe" stufenweise die Höhe zu und springt anschließend in die "Ausgangshöhe" zurück. Je nachdem, welche Skalierung ich verwende, tritt das Phänomen mehr oder weniger auf. Das Problem ist wohl der Sprung zurück in die "Ausgangshöhe".

Sieht eigentlich so aus, wie wenn das Tile nicht an der exakten Position in der Textur gelesen wird, sondern etwas nach oben oder unten verschoben.

Lord Horazont hat geschrieben:
Ich vermute auch, dass es was mit Rundungsproblemen beim abbilden der Vertexkoordinaten auf Pixel/Fragments zu tun hat

Das würde auch zu meiner Beschreibung passen.

Wie deaktiviere ich Antialiasing?
Code:
  1. glDisable(GL_LINE_SMOOTH);


TAK2004 hat geschrieben:
Erster Test wäre zu gucken wie große deine Positionen sind und entsprechend mal mit scale alles zu verkleinern und zu prüfen ob es verschwindet.

Wenn ich verkleinere, tritt das Problem immernoch auf, die Pixel "wachsen" jedoch langsamer an. Wenn ich vergrößere, tritt der Sprung öfter auf.

TAK2004 hat geschrieben:
Dabei sollte man auch die Kamera Position vorher mit der Position von den Zellen subtrahieren/addieren, um nah wie möglich an 0,0,0 mit der Translation zu kommen.

Ich habe auch schon ein Scrollen ohne verschieben der Kamera Position implemeniert (einfach durch das Zeichnen der Tiles an andere Positionen). Dort tritt das Problem auch auf.

TAK2004 hat geschrieben:
Wenn du noch keine Indizes benutzt, dann solltest du diese verwenden, da Rundungsfehler bei Quad-Tiles geteilt werden statt jeder Tile sie für sich selbst macht.

Könntest Du das bitte genauer erläutern? Ich kann mir darunter nichts genaues vorstellen. Danke!

Vielleicht sollte ich noch hinzufügen, dass ich den alten immediate Mode verwende. Ich weiss auch garnicht, ob meine alte Kiste VBO's unterstützt.

EDIT: Im der demo5.exe des Tutorials opengl2d tritt, soweit ich das beurteilen kann das gleiche oder zumindest ein ähnliches Problem auf.

O.k. wenn ich nicht skaliere und für den MIN und MAG Filter GL_NEAREST verwende, ist das Problem beim Scrollen Pixel für Pixel nicht mehr sichtbar, beim normaler Scrollgeschwindigkeit tritt das Problem etwas weniger auf. Sobald ich jedoch bei GL_NEAREST die Auflösung ändere, also skaliere, verschwimmt beim vertikalen Scrollen alles, das horizontale Scrollen sieht ganz gut aus ;-) Kann es vielleicht auch mit den Filtern zusammenhängen?

Viele Grüße und Danke nochmal!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tiled Map lädt nicht richtig
BeitragVerfasst: Di Jun 17, 2014 08:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm… Am allerbesten wäre es, wenn du ein Video oder zumindest ein zwei Screenshots bereitstellen könntest. Das würde der Diagnose behilflich sein.

„Echtes“ Antialiasing bekommt man via Multisampling und muss beim erstellen eines Kontext angefragt werden. Es gibt noch GL_LINE_SMOOTH und GL_POLYGON_SMOOTH, die du auf jeden fall aus schalten solltest.

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: Tiled Map lädt nicht richtig
BeitragVerfasst: Di Jun 17, 2014 09:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
GL_LINE_SMOOTH sollte eigentlich nur bei Workstation Karten, wie z.B. Quadro beachtet werden, sonnst sollte es ignoriert werden und früher ist das mal in den Software Modus gesprungen und man konnte die Pixel beim Rendern beobachten.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tiled Map lädt nicht richtig
BeitragVerfasst: Di Jun 17, 2014 16:25 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Hallo,

Wer mal testen möchte, kann sich gerne im Projekt-Thread NewSga-Projekt die aktuelle Version runterladen. Die Tilesets mit C64-Grafiken findet ihr weiter oben im Thread. Die Geschwindkeit lässt sich durch Druck auf die F8-Taste drosseln und durch Druck auf die F9-Taste wieder erhöhen. Die Höhle des Screenshots ist aus dem Levelset Richidash 01. Hier kann man das Problem vor allem beim vertikalen Scrollen recht deutlich sehen.

Die Skalierung ist PAL (Tiles sind etwas höher). Wenn ich die Original-Auflösung mit einem Seitenverhältnis 4:3 verwende, tritt das Problem deutlich seltener auf.

Das Deaktivieren von GL_LINE_SMOOTH und GL_POLYGON_SMOOTH bringt keine Veränderungen.

Generell stört es mich nicht sehr stark. Wenn man diesen Effekt beseitigen könnte, wäre es natürlich eine feine Sache, ansonsten kann ich damit jedoch auch ganz gut leben. Bei normaler Scrollgeschwindigkeit fällt es nur auf, wenn man darauf achtet.

Viele Grüße


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 15 Queries | GZIP : On ]