Perché ci sono delle linee tra le mie tessere?


14

Sto realizzando un gioco XNA top down. Le mappe sono create da tessere. Un problema che ho notato di recente è una "griglia" di linee tra le piastrelle. Viene visualizzato solo a volte e solo in base alla posizione della telecamera. Lascio che XNA gestisca il posizionamento, perché vengono visualizzate queste linee?

Ecco una foto con le linee:

inserisci qui la descrizione dell'immagine

Tuttavia, dopo aver spostato la mia fotocamera per un po ', torna magicamente a come dovrebbe apparire:

inserisci qui la descrizione dell'immagine

Grazie per qualsiasi aiuto!

MODIFICARE:

Questo è il meglio che posso fare per il codice sorgente, questo è un progetto estremamente grande e il rendering è fatto in più aree:

Main Render Loop Per elementi dinamici come piastrelle:

    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

La mia ricerca:

Ho fatto qualche ricerca in esso e questo è stato che ho trovato:

  • Questo problema si chiama lacrimazione (credo?)
  • È comunemente causato dall'utilizzo di un tipo di dati in virgola mobile per mantenere la posizione della piastrella (lo sto usando, Integerquindi questo non dovrebbe essere un problema, giusto?)

Come disegni le tue tessere? Incolla il tuo codice di disegno e tutti gli altri codici rilevanti, abbiamo seriamente bisogno di ulteriori informazioni :) Il problema potrebbe avere a che fare con errori di arrotondamento / precisione.

@JaakkoLipsanen, ecco, ho aggiunto del codice :)
Freesnöw

1
Di recente è stata posta una domanda su un argomento simile che potrebbe valere la pena di leggere.
Andrew Russell,

Mentre alla domanda sulle linee tra le tue tessere è stata data una risposta, ho notato che ci sono anche delle linee sulle tue tessere (es. Trama di erba cattiva). Se vuoi risolvere anche questo, leggi questo: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Risposte:


19

Presumo che, sebbene le posizioni delle tessere siano definite in numeri interi, la posizione della videocamera potrebbe non esserlo. Pertanto, se si sta tentando di eseguire il rendering di posizioni pixel perfette da una posizione non pixel perfetta, il campionamento potrebbe essere spento e causare linee tra le piastrelle. Nel tuoSpriteBatch.Draw chiamate, suggerirei di cambiare SamplerState inPointClamp garantire che le trame vengano campionate su base puntuale e che dovrebbe rimuovere quelle righe extra.

Il tuo codice è stato modificato:

spriteBatch.Begin(
    SpriteSortMode.Deferred, 
    Nothing, 
    SamplerState.PointClamp, 
    Nothing, 
    Nothing, 
    Nothing, 
    Matrix.CreateTranslation(CameraX, CameraY, 0))

1

Ho avuto un problema simile con DirectX 11 e questo ha funzionato per me:

Ho cambiato la modalità dell'indirizzo di trama nella descrizione dello stato del campionatore. La modalità indirizzo trama viene utilizzata per controllare cosa fa Direct3D con le coordinate trama al di fuori dell'intervallo (in DirectX 11, questo è [0.0f, 1.0f]). Ho cambiato il ADDRESS_U, ADDRESS_V,ADDRESS_W i membri aD3D11_TEXTURE_ADDRESS_CLAMP che serra valori fuori range di coordinate texture nella gamma.

Se nel tuo codice è presente un parametro analogo, questo potrebbe essere d'aiuto.


0

Ho avuto un problema simile anche con le linee visualizzate tra le mie tessere, ma cambiando lo stato del campionatore in Point Clamp non è stato risolto il problema.

Invece ho scoperto che la disattivazione del multicampionamento e la sincronizzazione della traccia verticale hanno risolto il problema. Questo è in XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Spero che questo aiuti qualcuno là fuori!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.