3 Stimmen

OpenGL Pixel Lücke zwischen übersetzten Quadraten

Ich habe in ein Problem, dass es gelegentlich ein Pixel Löcher entlang der Verbindung zwischen 2 Objekten, die den gleichen Satz von Scheitelpunkten haben, aber übersetzt, um nebeneinander zu sein laufen. Ich habe es geschafft, dies mit einer Reihe von einfachen Quadraten zu reproduzieren.

Die Quadrate sind 1 Einheit mal 1 Einheit mit dem Mittelpunkt 0,0. Ich positionierte eine Reihe dieser Quadrate in einer Linie, mit glTranslatef, um jedes Quadrat in Position zu bringen (die Werte, die ich zur Verfügung stelle, sind in diesem Fall immer Ganzzahlen). Ich habe festgestellt, dass OpenGL, wenn sich die Kamera an bestimmten Positionen befindet, eine Lücke von einem Pixel zwischen diesen Quadraten lässt, durch die ich sehen kann, was sich dahinter befindet (z. B. die Farbe, auf die ich den Hintergrundpuffer gelöscht habe). Das Ändern der Eckpunkte der Quadrate auf 0,0 in einer Ecke hat das Problem nicht gelöst.

Beispiel-Code:

glPushMatrix();
glTranslatef(0, 0, 0);
drawSquare();
glPopMatrix();

glPushMatrix();
glTranslatef(0, 0, 1);
drawSquare();
glPopMatrix();

glPushMatrix();
glTranslatef(0, 0, 2);
drawSquare();
glPopMatrix();

Das Bild zeigt einen solchen Fall. Ich habe dem Bildschirmfoto einen roten Kreis um den problematischen Pixel hinzugefügt.

Image

Ich habe keine Ahnung, warum dies der Fall ist, und während die Angabe der endgültigen "Welt"-Koordinaten, die die Verschiebungen pro Quadrat eliminieren, für einfache Quadrate möglich ist (und das Problem löst), ist dies bei der weitaus komplizierteren Geometrie, bei der mir das Problem zuerst aufgefallen ist, nicht wirklich praktikabel.

3voto

Michael Slade Punkte 13634

Ich weiß nicht, wie der Effekt genannt wird, aber ich weiß, wie er abläuft.

Wenn zwei Polygone eine Kante "teilen", aber die Endpunkte dieser Kante mit unterschiedlichen Werten berechnet werden, gibt es immer einige Fehler in den resultierenden übersetzten Scheitelpunktkoordinaten. Ein kleiner Fehler in den Scheitelpunktkoordinaten verändert die Punkte, aus denen sich die Kanten zusammensetzen, und so entstehen (1) überlappende Pixel (normalerweise keine große Sache) und (2) fehlende Pixel, wie in Ihrem Beispiel gezeigt.

Zwar kann man in der Regel einige Anstrengungen unternehmen, um die Duplizierung gemeinsamer Scheitelpunkte zu minimieren, aber im Allgemeinen kann das Problem schwer werden.

Minecraft zum Beispiel hat das gleiche Problem.

Eine mögliche schnelle Lösung ist die Anwendung einer Skalierungstransformation auf die betroffenen Objekte mit einem sehr kleinen Vergrößerungsfaktor, z. B. 1,00001. Dadurch überlappen sich die Objekte geringfügig und alle vernachlässigten Pixel sollten entfernt werden. Ihre Erfahrungen können variieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X