Warum sind zwischen meinen Fliesen Linien?


14

Ich mache ein Top-Down-XNA-Spiel. Die Karten werden durch Kacheln erstellt. Ein Problem, das mir kürzlich aufgefallen ist, ist ein Linienraster zwischen den Kacheln. Es erscheint nur manchmal und nur abhängig von der Kameraposition. Ich überlasse XNA die Positionierung. Warum werden diese Zeilen angezeigt?

Hier ist ein Bild mit den Linien:

Bildbeschreibung hier eingeben

Nachdem ich meine Kamera ein wenig bewegt habe, kehrt sie auf magische Weise zu dem zurück, was sie aussehen soll:

Bildbeschreibung hier eingeben

Danke für jede Hilfe!

BEARBEITEN:

Dies ist das Beste, was ich für Quellcode tun kann, dies ist ein extrem großes Projekt und das Rendern erfolgt in mehreren Bereichen:

Hauptrenderschleife Für dynamische Elemente wie Kacheln:

    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 Klasse:

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

Meine Forschung:

Ich habe einige Nachforschungen angestellt und Folgendes gefunden:

  • Dieses Problem nennt man Zerreißen (glaube ich?)
  • Es wird häufig durch die Verwendung eines Gleitkomma-Datentyps zum Festhalten der Kachelposition verursacht (ich verwende, Integeralso sollte dies kein Problem sein, oder?)

Wie zeichnest du deine Fliesen? Fügen Sie Ihren Zeichnungscode und alle anderen relevanten Codes ein, wir benötigen dringend weitere Informationen :) Das Problem kann möglicherweise mit Rundungsfehlern / Genauigkeit zusammenhängen.

@JaakkoLipsanen, da habe ich etwas Code hinzugefügt :)
Freesnöw

1
Es war erst vor kurzem eine Frage zu einem ähnlichen Thema , das auch lesenswert sein kann.
Andrew Russell

Während die Frage nach Linien zwischen Ihren Fliesen beantwortet wurde, habe ich festgestellt, dass sich auch Linien auf Ihren Fliesen befinden (z. B. schlechte Grasstruktur). Wenn Sie das auch beheben möchten, lesen Sie dies: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Antworten:


19

Ich gehe davon aus, dass Ihre Kachelpositionen zwar in ganzen Zahlen definiert sind, Ihre Kameraposition jedoch möglicherweise nicht. Wenn Sie also versuchen, pixelgenaue Positionen von einer nicht pixelgenauen Position zu rendern, ist die Abtastung möglicherweise deaktiviert und verursacht Linien zwischen den Kacheln. In Ihren SpriteBatch.DrawAnrufen würde ich vorschlagen, den SamplerState auf zu ändernPointClamp um sicherzustellen, dass die Texturen punktuell abgetastet werden und diese zusätzlichen Linien entfernt werden.

Ihr Code überarbeitet:

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

1

Ich hatte ein ähnliches Problem mit DirectX 11 und das hat bei mir funktioniert:

Ich habe den Texturadressmodus in der Beschreibung des Sampler-Status geändert. Der Texturadressmodus wird verwendet, um zu steuern, wie Direct3D mit Texturkoordinaten außerhalb des Bereichs umgeht (dies ist in DirectX 11 der Fall [0.0f, 1.0f]). Ich änderte die ADDRESS_U, ADDRESS_V,ADDRESS_W MitgliederD3D11_TEXTURE_ADDRESS_CLAMP dem klemmt out-of-range Werte der Texturkoordinaten in den Bereich.

Wenn sich in Ihrem Code ein analoger Parameter befindet, kann dies hilfreich sein.


0

Ich hatte ein ähnliches Problem mit Linien, die auch zwischen meinen Kacheln auftauchten, aber das Ändern des Sampler-Status in Point Clamp behebte das Problem nicht.

Stattdessen stellte ich fest, dass das Deaktivieren der Mehrfachabtastung und das Synchronisieren der vertikalen Ablaufverfolgung das Problem behoben haben. Dies ist in XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Hoffe das hilft jemandem da draußen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.