seit langer Zeit komme ich nun wieder etwas dazu, mich mit OpenGL zu beschäftigen. Ich arbeite an einem kleinen 2D-Game das auf Tiles basiert. Ich habe eine große Textur in der ich alle Tiles speichere. Beim Zeichnen wähle ich dann über die Texturkoordinaten das entsprechende Tile aus.
Nun scheint mir OpenGLs Interpolation dabei einen Streich zu spielen, da Tiles, die sich in der Textur am Rand befinden, so interpoliert werden, dass Ränder entstehen, die sich vor allem beim Bewegen der Kamera bemerkbar machen. Meine Idee war es, also die Interpolation abzustellen (GL_NEAREST). Dadurch verschwinden diese Lücken, aber beim vertikalen scrollen sieht man an diversen Kamerapositionen plötzlich dicke Streifen. Das Ganze scheint mit der Framerate zusammenzuhängen, da dies nach einer Beschränkung auf 100FPS nicht mehr auftritt.
Ist die Beschränkung der FPS zusammen mit GL_NEAREST das in diesem Falle angemessene Mittel oder gibt es eine elegantere Lösung?
GL_NEAREST ist keine gute Lösung, es sei den du willst extrem häßliche Texturen wann immer zwischen zwei Texturtexel zugegriffen wird.
Mögliche Lösungen: 1. Baue dir einen Shader der vor dem Texturzugriff ein "Clamp to Edge" für des entsprechende Tile ausführt. Du beschränkst die Koordinaten also auf die Mitte der jeweiligen Randpixel der Tiles.
2. In deiner großen Textur die deine Tiles enthält bekommt jedes Tile einen zusätzlichen 1px Rand indem du einfach den jeweiligen Randpixel noch einmal wiederholst. Also aus einem 128x128 Tile wird 130x130. Damit löst du das Problem wie von selbst, allerdings wird die Berechnung der Tile-Position etwas komplizierter. Wenn du Anisotropen-Filter benutzt ist ein 4px Rand ratsam.
Beide Lösungen bekommen Probleme wenn Mipmaps generiert werden. Bei der 2. Lösung kannst du allerdings zumindest die Randdicke verdoppeln um eine weitere Mipmap-Stufe sauber erzeugen zu können. Also wenn du das Tile in einem Viertel der Größe anzeigen willst musst der Rand viermal so dick sein.
Ich könnte auch die Textur um ein ganzes Feld nach innen verschieben und da dann einen Pixel drum malen. Ich halte die Lösung nur nicht für sonderlich elegant. Das mit dem Shader klingt schon vielversprechender. Ich werde das mal ausprobieren, danke.
Mitglieder in diesem Forum: Google [Bot] und 18 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.