Pourquoi y a-t-il des lignes entre mes carreaux?

14

Je fais un jeu XNA de haut en bas. Les cartes sont créées par des tuiles. Un problème que j'ai récemment remarqué est une «grille» de lignes entre les carreaux. Il n'apparaît que parfois et uniquement en fonction de la position de la caméra. Je laisse XNA gérer le positionnement, pourquoi ces lignes apparaissent-elles?

Voici une image avec les lignes:

entrez la description de l'image ici

Cependant, après avoir légèrement bougé mon appareil photo, cela revient magiquement à la façon dont il est censé apparaître:

entrez la description de l'image ici

Merci pour toute aide!

ÉDITER:

C'est le mieux que je puisse faire pour le code source, c'est un projet extrêmement volumineux et le rendu se fait sur plusieurs zones:

Boucle de rendu principale Pour les éléments dynamiques tels que les tuiles:

    spriteBatch.Begin(SpriteSortMode.Deferred, Nothing, SamplerState.LinearClamp, Nothing, Nothing, Nothing, Matrix.CreateTranslation(CameraX, CameraY, 0))
    Mode.Render(spriteBatch, False)
    For Each j As [Delegate] In DynamicInjectionList
        j.DynamicInvoke(spriteBatch)
    Next
    DynamicInjectionList.Clear()
    spriteBatch.End()

Mode.Render:

For x As Integer = 0 To GRIDMAX - 1
    For y As Integer = 0 To GRIDMAX - 1
        For z As Integer = 0 To 2
            Dim ter As TiledTerrain = Terrain(x, y, z)
            If ter IsNot Nothing Then
                sb.Draw(CBaseClient.TextureLibrary("TileMap"), New Rectangle(x * GRIDSIZE, y * GRIDSIZE, GRIDSIZE, GRIDSIZE), New Rectangle(ter.Texture_X, ter.Texture_Y, GRIDSIZE, GRIDSIZE), Color.White)
            End If
        Next
    Next
Next

TiledTerrain.vb Classe:

Imports ProtoBuf

<ProtoContract()> _
Public Class TiledTerrain

    <ProtoMember(1)> _
    Public Property X As Integer
    <ProtoMember(2)> _
    Public Property Y As Integer
    <ProtoMember(3)> _
    Public Property Z As Integer

    <ProtoMember(4)> _
    Public Property Texture_X As Integer
    <ProtoMember(5)> _
    Public Property Texture_Y As Integer

End Class

Ma recherche:

J'ai fait quelques recherches et c'est là que j'ai trouvé:

  • Ce problème est appelé déchirure (je crois?)
  • Cela est généralement causé par l'utilisation d'un type de données à virgule flottante pour maintenir la position de la tuile (j'utilise Integerdonc cela ne devrait pas poser de problème, non?)
Freesnöw
la source
Comment dessinez-vous vos tuiles? Collez votre code de dessin et tout autre code pertinent, nous avons vraiment besoin de plus d'informations :) Le problème pourrait éventuellement avoir quelque chose à voir avec les erreurs d'arrondi / précision.
@JaakkoLipsanen, Là, j'ai ajouté du code :)
Freesnöw
1
Il y a tout récemment, une question sur un sujet similaire mérite peut-être d'être lue également.
Andrew Russell
Bien que la question sur les lignes entre vos carreaux ait été répondue, j'ai remarqué qu'il y a aussi des lignes sur vos carreaux (c'est-à-dire une mauvaise texture d'herbe). Si vous voulez résoudre ce problème aussi, lisez ceci: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Réponses:

19

Je suppose que bien que vos positions de tuile soient définies en nombres entiers, la position de votre caméra peut ne pas l'être. Donc, si vous essayez de rendre des positions parfaites en pixels à partir d'une position non parfaite en pixels, l'échantillonnage peut être désactivé et provoquer des lignes entre les carreaux. Dans vos SpriteBatch.Drawappels, je suggérerais de changer le SamplerState pour PointClamps'assurer que les textures sont échantillonnées sur une base de points et que cela devrait supprimer ces lignes supplémentaires.

Votre code révisé:

spriteBatch.Begin(
    SpriteSortMode.Deferred, 
    Nothing, 
    SamplerState.PointClamp, 
    Nothing, 
    Nothing, 
    Nothing, 
    Matrix.CreateTranslation(CameraX, CameraY, 0))
Mike Cluck
la source
1

J'ai eu un problème similaire avec DirectX 11 et cela a fonctionné pour moi:

J'ai changé le mode d'adresse de texture dans la description de l'état de l'échantillonneur. Le mode d'adresse de texture est utilisé pour contrôler ce que Direct3D fait avec les coordonnées de texture en dehors de la plage (dans DirectX 11, c'est le cas [0.0f, 1.0f]). J'ai changé ADDRESS_U, ADDRESS_V, ADDRESS_Wmembres D3D11_TEXTURE_ADDRESS_CLAMPqui serre hors de portée des valeurs de coordonnées de texture dans la gamme.

S'il y a un paramètre analogue dans votre code, cela pourrait vous aider.

filtalpp
la source
0

J'ai également eu un problème similaire avec des lignes apparaissant entre mes carreaux, mais le changement de l'état de l'échantillonneur en Point Clamp n'a pas résolu le problème.

Au lieu de cela, j'ai constaté que la désactivation du multi-échantillonnage et la synchronisation de la trace verticale résolvaient le problème. C'est dans XNA 4.0:

public GraphicsDeviceManager _graphics;

_graphics = new GraphicsDeviceManager(this);
_graphics.PreferMultiSampling = false;
_graphics.SynchronizeWithVerticalRetrace = true;

J'espère que cela aide quelqu'un là-bas!

thegrak
la source