Mengapa ada garis di antara ubin saya?

14

Saya membuat game XNA top-down. Peta dibuat oleh ubin. Masalah yang baru-baru ini saya perhatikan adalah 'kisi' garis di antara ubin. Itu hanya muncul kadang-kadang dan hanya tergantung pada posisi kamera. Saya membiarkan XNA menangani penentuan posisi, mengapa garis-garis ini muncul?

Ini adalah gambar dengan garis:

masukkan deskripsi gambar di sini

Namun, setelah memindahkan kamera saya sedikit, secara ajaib kembali ke bagaimana seharusnya muncul:

masukkan deskripsi gambar di sini

Terima kasih atas bantuannya!

EDIT:

Ini adalah yang terbaik yang dapat saya lakukan untuk kode sumber, ini adalah proyek yang sangat besar dan rendering dilakukan di beberapa area:

Main Render Loop Untuk elemen dinamis seperti ubin:

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

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

Penelitian saya:

Saya telah melakukan beberapa pencarian ke dalamnya dan inilah yang saya temukan:

  • Masalah ini disebut sobek (saya percaya?)
  • Ini biasanya disebabkan oleh menggunakan tipe data floating point untuk menahan posisi ubin (saya menggunakan Integerjadi ini seharusnya tidak menjadi masalah kan?)
Freesnöw
sumber
Bagaimana Anda menggambar ubin Anda? Rekatkan kode gambar Anda dan semua kode relevan lainnya, kami sangat membutuhkan informasi lebih lanjut :) Masalahnya mungkin ada hubungannya dengan kesalahan pembulatan / ketepatan.
@ JaakkoLipsanen, Di sana, saya telah menambahkan beberapa kode :)
Freesnöw
1
Baru- baru ini ada pertanyaan tentang topik serupa yang mungkin layak dibaca juga.
Andrew Russell
Sementara pertanyaan tentang garis di antara ubin Anda telah dijawab, saya perhatikan ada juga garis di ubin Anda (yaitu tekstur rumput yang buruk). Jika Anda ingin memperbaikinya juga, baca ini: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Jawaban:

19

Saya berasumsi bahwa meskipun posisi ubin Anda didefinisikan dalam bilangan bulat, posisi kamera Anda mungkin tidak. Jadi jika Anda mencoba membuat posisi piksel-sempurna dari posisi non -piksel-sempurna maka pengambilan sampel mungkin tidak aktif dan menyebabkan garis di antara ubin. Dalam SpriteBatch.Drawpanggilan Anda , saya akan menyarankan untuk mengubah SamplerState untuk PointClampmemastikan bahwa tekstur diambil sampel berdasarkan titik dan harus menghapus garis-garis tambahan itu.

Kode Anda direvisi:

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

Saya memiliki masalah serupa dengan DirectX 11 dan ini berhasil untuk saya:

Saya mengubah mode alamat tekstur dalam deskripsi status sampler. Mode alamat tekstur digunakan untuk mengontrol apa yang dilakukan Direct3D dengan koordinat tekstur di luar kisaran (dalam DirectX 11, ini[0.0f, 1.0f] ). Saya mengubah ADDRESS_U, ADDRESS_V, ADDRESS_Wanggota untuk D3D11_TEXTURE_ADDRESS_CLAMPyang klem out-of-range nilai koordinat tekstur ke dalam jangkauan.

Jika ada parameter analog dalam kode Anda, ini mungkin membantu.

filtalpp
sumber
0

Saya memiliki masalah yang sama dengan garis muncul di antara ubin saya juga, tetapi mengubah keadaan sampler ke Point Clamp tidak memperbaiki masalah.

Sebaliknya saya menemukan bahwa mematikan multi-sampling dan menyinkronkan jejak vertikal memperbaiki masalah. Ini ada di XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Semoga ini bisa membantu seseorang di luar sana!

thegrak
sumber