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.
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
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 network • my 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
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
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 network • my 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
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
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:
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?
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 network • my 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
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
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.
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.