Dlaczego między moimi płytkami są linie?


14

Robię odgórną grę XNA. Mapy są tworzone za pomocą kafelków. Problem, który ostatnio zauważyłem, to „siatka” linii między płytkami. Pokazuje się tylko czasami i tylko w zależności od położenia kamery. Pozwalam XNA zająć się pozycjonowaniem, dlaczego te linie się wyświetlają?

Oto zdjęcie z liniami:

wprowadź opis zdjęcia tutaj

Jednak po przesunięciu nieco kamery w magiczny sposób powraca ona do tego, jak ma wyglądać:

wprowadź opis zdjęcia tutaj

Dzięki za wszelką pomoc!

EDYTOWAĆ:

Jest to najlepsze, co mogę zrobić dla kodu źródłowego, jest to bardzo duży projekt, a renderowanie odbywa się w wielu obszarach:

Główna pętla renderowania Dla elementów dynamicznych, takich jak płytki:

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

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

Moje badania:

Przeszukałem go i oto, co znalazłem:

  • Ten problem nazywa się łzawieniem (wierzę?)
  • Zwykle jest to spowodowane użyciem typu danych zmiennoprzecinkowych do utrzymania pozycji kafelka (używam, Integerwięc nie powinno to stanowić problemu, prawda?)

Jak rysujesz kafelki? Wklej kod rysunku i cały inny odpowiedni kod, poważnie potrzebujemy więcej informacji :) Problem może mieć coś wspólnego z błędami zaokrąglania / precyzją.

@JaakkoLipsanen, tam, dodałem trochę kodu :)
Freesnöw

1
Było niedawno pytanie na podobny temat, który może być wart czytania zbyt.
Andrew Russell,

Odpowiedzi na pytanie o linie między kafelkami zauważyłem, że na kafelkach są również linie (tj. Zła tekstura trawy). Jeśli chcesz to naprawić, przeczytaj to: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Odpowiedzi:


19

Zakładam, że chociaż pozycje kafelków są zdefiniowane w liczbach całkowitych, pozycja kamery może być inna. Więc jeśli próbujesz renderować pozycje w pikselach z pozycji nie w pikselach, próbkowanie może być wyłączone i powodować linie między płytkami. W twoich SpriteBatch.Drawrozmowach sugerowałbym zmianę SamplerState, aby PointClampupewnić się, że tekstury są próbkowane punktowo i że powinien usunąć te dodatkowe linie.

Twój kod został poprawiony:

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

1

Miałem podobny problem z DirectX 11 i to działało dla mnie:

Zmieniłem tryb adresu tekstury w opisie stanu samplera. Tryb adresu tekstury służy do kontrolowania tego, co robi Direct3D ze współrzędnymi tekstury poza zakresem (w DirectX 11 to jest[0.0f, 1.0f] ). Zmieniłem ADDRESS_U, ADDRESS_V, ADDRESS_Wczłonkom D3D11_TEXTURE_ADDRESS_CLAMPktóry zaciska poza zakresem wartości współrzędnych tekstur do zakresu.

Jeśli w kodzie znajduje się analogiczny parametr, może to pomóc.


0

Miałem podobny problem z liniami pojawiającymi się również między moimi płytkami, ale zmiana stanu samplera na Point Clamp nie rozwiązała problemu.

Zamiast tego odkryłem, że wyłączenie wielu próbkowania i synchronizacja pionowego śledzenia rozwiązało problem. To jest w XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Mam nadzieję, że to pomoże komuś tam!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.