Почему между моими плитками есть линии?


14

Я делаю игру XNA сверху вниз. Карты созданы плитками. Проблема, которую я недавно заметил, это «сетка» линий между плитками. Отображается только иногда и только в зависимости от положения камеры. Я позволил XNA управлять позиционированием, почему эти линии отображаются?

Вот картинка с линиями:

введите описание изображения здесь

Тем не менее, после небольшого перемещения моей камеры, она волшебным образом возвращается к тому, как она должна выглядеть:

введите описание изображения здесь

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ:

Это лучшее, что я могу сделать для исходного кода, это очень большой проект, и рендеринг выполняется в нескольких областях:

Основной цикл рендеринга Для динамических элементов, таких как плитки:

    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 Учебный класс:

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

Мое исследование:

Я сделал некоторые поиски в этом, и это было, я нашел:

  • Эта проблема называется разрывом (я верю?)
  • Обычно это вызвано использованием типа данных с плавающей запятой для удержания позиции плитки (я использую, Integerтак что это не должно быть проблемой, верно?)

Как вы рисуете свои плитки? Вставьте свой чертежный код и все другие соответствующие коды, нам серьезно нужна дополнительная информация :) Возможно , проблема связана с ошибками округления / точностью.

@JaakkoLipsanen, там я добавил немного кода :)
Freesnöw

1
Был совсем недавно вопрос на тему , что может быть стоит читать тоже.
Эндрю Рассел

Несмотря на то, что на вопрос о линиях между вашими плитками был дан ответ, я заметил, что на ваших плитках также есть линии (то есть плохая текстура травы). Если вы тоже хотите это исправить, прочитайте это: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Дан,

Ответы:


19

Я предполагаю, что, хотя ваши позиции плитки определены в целых числах, ваша позиция камеры может не быть. Так что, если вы пытаетесь визуализировать идеальные по пикселям позиции из не идеальных по пикселям, тогда выборка может быть отключена, что приведет к появлению линий между плитками. В ваших SpriteBatch.Drawзвонках я бы предложил изменить SamplerState, чтобы PointClampобеспечить выборку текстур по точкам и удалить лишние линии.

Ваш код исправлен:

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

1

У меня была похожая проблема с DirectX 11, и это сработало для меня:

Я изменил режим адреса текстуры в описании состояния сэмплера. Режим адресации текстуры используется для управления действиями Direct3D с координатами текстуры вне диапазона (в DirectX 11 это так [0.0f, 1.0f]). Я изменил ADDRESS_U, ADDRESS_V, ADDRESS_Wчлены D3D11_TEXTURE_ADDRESS_CLAMPкоторой зажимы из- за границами диапазона значений координат текстуры в диапазон.

Если в вашем коде есть аналогичный параметр, это может помочь.


0

У меня была похожая проблема с линиями, появляющимися между моими тайлами, но изменение состояния сэмплера на Point Clamp не решило проблему.

Вместо этого я обнаружил, что отключение мультисэмплинга и синхронизация вертикальной трассы устранили проблему. Это в XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Надеюсь, это поможет кому-то там!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.