Il existe deux causes possibles pour ce type de problème, selon exactement de quel problème il s'agit. Je vais énumérer les deux:
1. Vous voyez d'autres couleurs de votre texture le long des bords des carreaux.
Cela me semble être le problème dans ce cas, car tous les pixels de bord sont l'une des trois couleurs qui sont plausiblement dans votre texture: blanc, noir et marron.
Si vous utilisez plusieurs images de tuiles côte à côte dans une seule texture (un atlas de texture), comme je suppose que vous le faites, cela est inévitable. Cela se produit parce que le GPU ne correspond pas parfaitement à l'interpolation le long du bord d'un triangle avec l'interpolation le long de la texture, et vous obtenez de petits morceaux de la texture adjacente.
Il y a plusieurs choses que vous pouvez faire.
- Utilisez une texture de tableau au lieu d'un atlas de texture. Une texture matricielle est constituée d'une pile d'images 2D de même taille et vous spécifiez une troisième coordonnée pour en sélectionner une; il est destiné exactement à remplacer les atlas de texture sans problème de filtrage. Cependant, les textures de tableau sont une fonctionnalité plus récente qui peut ne pas être disponible dans la version d'OpenGL que vous utilisez.
- Générez une bordure de 1 pixel dans chacune de vos tuiles de texture, qui reproduit la couleur du pixel régulier adjacent. (Il s'agit essentiellement de réimplémenter les GL
CLAMP[_TO_EDGE]
, mais d'une manière qui est consciente des atlas de texture - votre utilisation de ceux-ci n'a aucun effet parce que la plupart de vos bords de carreaux ne sont pas au bord de la texture.) C'est la solution que j'utilise dans ma propre entrée dans le genre, Cubes . Je ne connais aucun inconvénient particulier, sauf qu'il utilise plus de mémoire de texture.
- Insérez très légèrement vos coordonnées de texture, afin qu'elles n'aillent pas jusqu'au bord de la tuile texture. En faire trop entraînera une minceur notable des bords de la texture par rapport aux pixels du milieu.
- Utilisez une seule texture par type de tuile. Cela impose des coûts de changement de texture.
2. Vous voyez à travers les écarts entre les tuiles.
Je ne pense pas que ce soit le problème dans ce cas, car il n'y a pas de terrain vert vu à travers les lacunes, mais je l'inclus pour être complet.
Cela peut se produire lorsque vous ne fournissez pas exactement les mêmes coordonnées pour les sommets des bords de réunion des tuiles adjacentes, ce qui se produit généralement en raison d'une erreur en virgule flottante. Par exemple, si vous avez des tuiles de taille 0,6 et calculez le bord droit de la tuile à x=100
avec (100*0.6) + 0.6
, et le bord gauche de la tuile à x=101
avec (100*0.6)
, vous n'obtiendrez pas la même réponse exacte, et la différence peut être visible sous forme de petites taches de lacunes.
La solution est de s'assurer que votre arithmétique est cohérente; voici quelques façons de procéder:
- Assurez-vous que vous ne calculez pas (même indirectement)
index*size + size
, mais seulement (index+1)*size
.
- Assurez-vous que votre arithmétique est exacte; la façon la plus simple de le faire est de rendre votre taille de tuile exactement 1,0, ce qui se traduira par une arithmétique entière exacte même si vous effectuez vos calculs avec des flottants 32 bits (jusqu'à 16 millions de blocs de l'origine, de toute façon).
- Utilisez des entiers réels pour les calculs de coordonnées de sommets; cela vous donne encore plus de portée.