Por que existem linhas entre meus ladrilhos?

14

Estou fazendo um jogo XNA de cima para baixo. Os mapas são criados por blocos. Um problema que notei recentemente é uma 'grade' de linhas entre os blocos. Aparece apenas às vezes e apenas dependendo da posição da câmera. Deixei o XNA lidar com o posicionamento. Por que essas linhas estão aparecendo?

Aqui está uma foto com as linhas:

insira a descrição da imagem aqui

No entanto, depois de mover minha câmera um pouco, ela volta magicamente à forma como deve aparecer:

insira a descrição da imagem aqui

Obrigado por qualquer ajuda!

EDITAR:

É o melhor que posso fazer para o código-fonte, este é um projeto extremamente grande e a renderização é feita em várias áreas:

Loop de renderização principal Para elementos dinâmicos, como blocos:

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

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

Minha pesquisa:

Eu fiz algumas pesquisas e é isso que eu encontrei:

  • Esse problema é chamado de lacrimejamento (acredito?)
  • Geralmente é causado pelo uso de um tipo de dados de ponto flutuante para manter a posição do bloco (estou usando, Integerportanto, isso não deve ser um problema, certo?)
Freesnöw
fonte
Como você desenha suas peças? Cole seu código de desenho e todos os outros códigos relevantes. Precisamos seriamente de mais informações :) O problema pode ter algo a ver com erros de arredondamento / precisão.
@JaakkoLipsanen, Ali, eu adicionei algum código :) #
Freesnöw #
1
Recentemente, houve uma pergunta sobre um tópico semelhante que também pode valer a pena ser lida.
Andrew Russell
Embora a pergunta sobre as linhas entre os ladrilhos tenha sido respondida, notei que também existem linhas nos ladrilhos (ou seja, textura ruim da grama). Se você quiser corrigir isso também, leia isto: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Respostas:

19

Suponho que, embora suas posições de bloco sejam definidas em números inteiros, a posição de sua câmera talvez não seja. Portanto, se você estiver tentando renderizar posições perfeitas em pixels a partir de uma posição não perfeita em pixels, a amostragem poderá ser desativada e causar linhas entre os blocos. Nas suas SpriteBatch.Drawchamadas, sugiro alterar o SamplerState para PointClampgarantir que as texturas sejam amostradas com base em pontos e que ele remova essas linhas extras.

Seu código revisou:

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

Eu tive um problema semelhante com o DirectX 11 e isso funcionou para mim:

Mudei o modo de endereço de textura na descrição do estado do amostrador. O modo de endereço de textura é usado para controlar o que o Direct3D faz com as coordenadas de textura fora do intervalo (no DirectX 11, este é [0.0f, 1.0f]). Mudei o ADDRESS_U, ADDRESS_V, ADDRESS_Wmembros para D3D11_TEXTURE_ADDRESS_CLAMPque aperta valores fora da faixa de coordenadas de textura para o intervalo.

Se houver um parâmetro análogo no seu código, isso poderá ajudar.

filtalpp
fonte
0

Também tive um problema semelhante com as linhas aparecendo entre meus blocos, mas alterar o estado do amostrador para Point Clamp não resolveu o problema.

Em vez disso, descobri que desativar a multi-amostragem e sincronizar o rastreamento vertical corrigia o problema. Isso está no XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Espero que isto seja útil a alguém!

thegrak
fonte