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:
No entanto, depois de mover minha câmera um pouco, ela volta magicamente à forma como deve aparecer:
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,
Integer
portanto, isso não deve ser um problema, certo?)
fonte
Respostas:
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.Draw
chamadas, sugiro alterar o SamplerState paraPointClamp
garantir que as texturas sejam amostradas com base em pontos e que ele remova essas linhas extras.Seu código revisou:
fonte
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 oADDRESS_U
,ADDRESS_V
,ADDRESS_W
membros paraD3D11_TEXTURE_ADDRESS_CLAMP
que 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.
fonte
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:
Espero que isto seja útil a alguém!
fonte