OpenGL Textur-Sampling unterschiedlich je nach Kameraposition

8

Ich rende ein point-basiertes Terrain aus geladenen Heightmap-Daten - aber die Punkte ändern ihre Textur abhängig davon, wo die Kameraposition ist. Um den Fehler zu demonstrieren (und die Tatsache, dass dies nicht durch ein z-Pufferungsproblem geschieht), habe ich Screenshots mit den gerenderten Punkten bei einer festen 5 Pixelgröße von sehr geringfügig unterschiedlichen Kamerapositionen (gleicher Winkel) gemacht, unten gezeigt:

PS: Die Bilder sind groß genug, wenn Sie sie in einen neuen Tab ziehen. Sie haben nicht erkannt, dass der Stapel sie so stark verkleinert.

Status 1:

Status 2:

Der Code zum Generieren von Punkten ist relativ einfach, also poste ich das nur, um die Option auszuschließen - mapArray ist ein eindimensionales Float-Array und wird in ein VBO kopiert:

%Vor%

Ich finde es wahrscheinlicher, dass ich meinen Fragment-Shader anpassen muss, weil ich mit Shadern nicht gut bin - obwohl ich nicht sicher bin, wo ich mit so einfachem Code schief gehen könnte und denke, dass er wahrscheinlich nicht geeignet ist ( mit punktbasiertem Rendering). Balg ist mein Frag Shader:

%Vor%

Bearbeiten (angeforderte Informationen): OpenGL Version 4.4 keine Textur-Flags verwendet.

TexCoordA wird direkt von meinem Vertex-Shader in den Shader ohne irgendwelche Änderungen übergeben. Selbstberechnete UV-Werte mit diesem:

%Vor%     
jProg2015 27.01.2014, 23:37
quelle

2 Antworten

0

Das sieht genau wie ein subpixelgenauer Textur-Mapping-Nebeneffekt aus. Das Problem bei der Texturzuordnungsimplementierung besteht darin, dass die Texturkoordinaten auf den tatsächlichen gerasterten Pixeln (Fragmenten) interpoliert werden müssen. Wenn sich Ihre Kamera bewegt, beeinflusst der Abrundungsfehler von der realen Position zur ganzzahligen Pixelposition das Textur-Mapping und wird normalerweise für jitterfreie Animationen benötigt (ansonsten würden alle Texturen bei der Bewegung der Kamera scheinbar zufällige Subpixel-Beträge überspringen großes Tutorial zu diesem Thema von Paul Nettle.

Sie können versuchen, dies zu beheben, indem Sie keine Texel-Ecken abtasten, sondern versuchen, Texel-Zentren zu testen (fügen Sie der Punkt-Textur-Koordinate die halbe Größe des Texels hinzu).

Eine andere Sache, die Sie versuchen können, ist, das subpixelgenaue Rendering zu kompensieren, indem Sie den Unterschied zwischen der gerasterten Ganzzahlkoordinate (die Sie selbst in einem Shader berechnen müssen) und der realen Position berechnen. Das könnte ausreichen, um die gesampelten Texel stabiler zu machen.

Schließlich ist die Größe wichtig. Wenn Ihre Textur groß ist, können die Fehler bei der Interpolation der Texturkoordinaten mit endlicher Genauigkeit diese Arten von Artefakten einbringen. Warum nicht GL_TEXTURE_2D_ARRAY mit einer separaten Ebene für jede Farbkachel verwenden? Sie können auch die Textzeichen S und T an den Rand der Textur anpassen, um dies eleganter zu vermeiden.

    
the swine 18.05.2014, 10:33
quelle
0

Nur eine Vermutung: Wie sind Ihre Point-Rendering-Parameter eingestellt? Vielleicht verursachen die Abstandsdämpfung ( GL_POINT_DISTANCE_ATTENUATION ) zusammen mit GL_POINT_SIZE_MIN und GL_POINT_SIZE_MAX unterschiedliche Fragmentgrößen, abhängig von der Kameraposition. Andererseits denke ich, dass ich mich erinnere, dass bei Verwendung eines Vertex-Shaders diese Funktionalität deaktiviert ist und der Vertex-Shader über die Größe entscheiden muss. Ich habe es einmal mit

gemacht %Vor%

wobei pointParam die drei Koeffizienten und die Min-Punktgröße enthält:

%Vor%

Sie können herumspielen, indem Sie Ihre Punktgröße im Vertex-Shader direkt mit gl_PointSize = [value] festlegen.

    
chruesel 21.03.2014 08:14
quelle

Tags und Links