J'ai un moteur de jeu 2D qui dessine des tilemaps en dessinant des tuiles à partir d'une image de jeu de tuiles. Parce que par défaut, OpenGL ne peut envelopper que la texture entière ( GL_REPEAT
), et pas seulement une partie, chaque mosaïque est divisée en une texture distincte. Ensuite, les régions de la même tuile sont rendues adjacentes les unes aux autres. Voici à quoi cela ressemble quand il fonctionne comme prévu:
Cependant, dès que vous introduisez une mise à l'échelle fractionnaire, des coutures apparaissent:
Pourquoi cela arrive-t-il? Je pensais que c'était dû au filtrage linéaire mélangeant les bordures des quads, mais cela se produit toujours avec le filtrage ponctuel. La seule solution que j'ai trouvée jusqu'à présent est de garantir que tout le positionnement et la mise à l'échelle se produisent uniquement aux valeurs entières, et d' utiliser le filtrage de points. Cela peut dégrader la qualité visuelle du jeu (en particulier, le positionnement sous-pixel ne fonctionne plus, donc le mouvement n'est pas si fluide).
Choses que j'ai essayées / considérées:
- l'anticrénelage réduit, mais n'élimine pas entièrement, les coutures
- désactiver le mipmapping, n'a aucun effet
- rendre chaque tuile individuellement et extruder les bords par 1px - mais c'est une désoptimisation, car elle ne peut plus rendre les régions de tuiles en une seule fois, et crée d'autres artefacts le long des bords des zones de transparence
- ajouter une bordure de 1px autour des images source et répéter les derniers pixels - mais ils ne sont plus à la puissance de deux, ce qui provoque des problèmes de compatibilité avec les systèmes sans prise en charge NPOT
- écrire un shader personnalisé pour gérer les images en mosaïque - mais que feriez-vous différemment?
GL_REPEAT
devrait saisir le pixel du côté opposé de l'image aux bords, et ne pas choisir la transparence. - la géométrie est exactement adjacente, il n'y a pas d'erreurs d'arrondi en virgule flottante.
- Si le fragment shader est codé en dur pour retourner la même couleur, les coutures disparaissent .
- si les textures sont définies sur au
GL_CLAMP
lieu deGL_REPEAT
, les coutures disparaissent (bien que le rendu soit incorrect). - si les textures sont définies sur
GL_MIRRORED_REPEAT
, les coutures disparaissent (bien que le rendu soit à nouveau erroné). - si je fais le fond rouge, les coutures sont toujours blanches. Cela suggère qu'il échantillonne du blanc opaque de quelque part plutôt que de la transparence.
Ainsi, les coutures n'apparaissent que lorsque GL_REPEAT
est défini. Pour une raison quelconque dans ce mode uniquement, aux bords de la géométrie, il y a un fond perdu / une fuite / une transparence. Comment est-ce possible? La texture entière est opaque.
GL_NEAREST
échantillonnage dans la R
direction des coordonnées fonctionnent aussi bien que les textures de tableau pour la plupart des choses dans ce scénario. Le mipmapping ne fonctionnera pas, mais à en juger par votre application, vous n'avez probablement pas besoin de mipmaps de toute façon.