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:
Jednak po przesunięciu nieco kamery w magiczny sposób powraca ona do tego, jak ma wyglądać:
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,
Integer
więc nie powinno to stanowić problemu, prawda?)
xna-4.0
tiles
terrain-rendering
Freesnöw
źródło
źródło
Odpowiedzi:
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.Draw
rozmowach sugerowałbym zmianę SamplerState, abyPointClamp
upewnić się, że tekstury są próbkowane punktowo i że powinien usunąć te dodatkowe linie.Twój kod został poprawiony:
źródło
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łemADDRESS_U
,ADDRESS_V
,ADDRESS_W
członkomD3D11_TEXTURE_ADDRESS_CLAMP
któ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.
źródło
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:
Mam nadzieję, że to pomoże komuś tam!
źródło