Ich habe eine 2D-Spiel-Engine, die Karten zeichnet, indem sie Kacheln aus einem Kachelsatzbild zeichnet. Da OpenGL standardmäßig nur die gesamte Textur ( GL_REPEAT
) und nicht nur einen Teil davon umschließen kann, wird jede Kachel in eine separate Textur aufgeteilt. Dann werden Bereiche derselben Kachel nebeneinander gerendert. So sieht es aus, wenn es wie vorgesehen funktioniert:
Sobald Sie die fraktionierte Skalierung einführen, werden jedoch folgende Nähte angezeigt:
Warum passiert das? Ich dachte, dass es an der linearen Filterung liegt, die die Grenzen der Quads überblendet, aber es passiert immer noch mit der Punktfilterung. Die einzige Lösung, die ich bisher gefunden habe, besteht darin, sicherzustellen, dass die gesamte Positionierung und Skalierung nur bei ganzzahligen Werten erfolgt, und Punktfilterung zu verwenden. Dies kann die visuelle Qualität des Spiels beeinträchtigen (insbesondere, wenn die Subpixel-Positionierung nicht mehr funktioniert und die Bewegung nicht mehr so flüssig ist).
Dinge, die ich versucht / in Betracht gezogen habe:
- Antialiasing reduziert die Nähte, beseitigt sie jedoch nicht vollständig
- das ausschalten von mipmapping hat keine wirkung
- Rendern Sie jede Kachel einzeln und extrudieren Sie die Kanten um 1px - dies ist jedoch eine Deoptimierung, da nicht mehr Bereiche von Kacheln auf einmal gerendert werden können und andere Artefakte entlang der Kanten von Transparenzbereichen erstellt werden
- Fügen Sie einen 1-Pixel-Rand um die Quellbilder hinzu und wiederholen Sie die letzten Pixel. In diesem Fall handelt es sich jedoch nicht mehr um Zweierpotenzen, was zu Kompatibilitätsproblemen mit Systemen ohne NPOT-Unterstützung führt
- Schreiben eines benutzerdefinierten Shaders für gekachelte Bilder - aber was würden Sie dann anders machen?
GL_REPEAT
sollte das Pixel von der gegenüberliegenden Seite des Bildes an den Rändern greifen und nicht Transparenz wählen. - Die Geometrie ist genau benachbart, es gibt keine Gleitkomma-Rundungsfehler.
- Wenn der Fragment-Shader hartcodiert ist, um dieselbe Farbe zurückzugeben, verschwinden die Nähte .
- Wenn die Texturen auf
GL_CLAMP
anstatt gesetzt sindGL_REPEAT
, verschwinden die Nähte (obwohl das Rendering falsch ist). - Wenn die Texturen auf gesetzt sind
GL_MIRRORED_REPEAT
, verschwinden die Nähte (obwohl das Rendering wieder falsch ist). - Wenn ich den Hintergrund rot mache, sind die Nähte immer noch weiß. Dies deutet darauf hin, dass das opake Weiß nicht von der Transparenz, sondern von einer anderen Stelle stammt.
Die Nähte erscheinen also nur, wenn GL_REPEAT
eingestellt ist. Aus irgendeinem Grund tritt nur in diesem Modus an den Rändern der Geometrie ein Anschnitt / Leck / Transparenz auf. Wie kann das sein? Die gesamte Textur ist undurchsichtig.
GL_NEAREST
Abtastung in R
Koordinatenrichtung funktionieren für die meisten Dinge in diesem Szenario genauso gut wie Array-Texturen . Mipmapping wird nicht funktionieren, aber Ihrer Anwendung nach benötigen Sie wahrscheinlich sowieso keine Mipmaps.