¿Por qué hay líneas entre mis mosaicos?

14

Estoy haciendo un juego XNA de arriba hacia abajo. Los mapas son creados por mosaicos. Un problema que noté recientemente es una "cuadrícula" de líneas entre los mosaicos. Solo aparece a veces y solo según la posición de la cámara. Dejo que XNA maneje el posicionamiento, ¿por qué aparecen estas líneas?

Aquí hay una foto con las líneas:

ingrese la descripción de la imagen aquí

Sin embargo, después de mover mi cámara un poco, mágicamente regresa a cómo se supone que debe aparecer:

ingrese la descripción de la imagen aquí

¡Gracias por cualquier ayuda!

EDITAR:

Esto es lo mejor que puedo hacer para el código fuente, este es un proyecto extremadamente grande y la representación se realiza en múltiples áreas:

Main Render Loop Para elementos dinámicos como mosaicos:

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

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

Mi investigación:

He investigado un poco y esto es lo que he encontrado:

  • Este problema se llama desgarro (¿creo?)
  • Es comúnmente causado por el uso de un tipo de datos de punto flotante para mantener la posición del mosaico (estoy usando, Integerasí que esto no debería ser un problema, ¿verdad?)
Freesnöw
fuente
¿Cómo dibujas tus fichas? Pegue su código de dibujo y todos los demás códigos relevantes, realmente necesitamos más información :) El problema podría tener algo que ver con errores de redondeo / precisión.
@JaakkoLipsanen, Allí, he agregado un código :)
Freesnöw
1
Recientemente hubo una pregunta sobre un tema similar que también vale la pena leer.
Andrew Russell
Si bien la pregunta sobre las líneas entre sus mosaicos ha sido respondida, noté que también hay líneas en sus mosaicos (es decir, mala textura del césped). Si quieres arreglar eso también, lee esto: gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

Respuestas:

19

Supongo que aunque sus posiciones de mosaico están definidas en enteros, la posición de su cámara puede no serlo. Entonces, si está tratando de representar posiciones perfectas en píxeles desde una posición no perfecta en píxeles, entonces el muestreo puede estar desactivado y causar líneas entre los mosaicos. En sus SpriteBatch.Drawllamadas, sugeriría cambiar el SamplerState para PointClampasegurarse de que las texturas se muestrean por puntos y que se eliminen esas líneas adicionales.

Su código revisado:

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

Tuve un problema similar con DirectX 11 y esto funcionó para mí:

Cambié el modo de dirección de textura en la descripción del estado del muestreador. El modo de dirección de textura se usa para controlar lo que Direct3D hace con coordenadas de textura fuera del rango (en DirectX 11, esto es [0.0f, 1.0f]). He cambiado el ADDRESS_U, ADDRESS_V, ADDRESS_Wmiembros a D3D11_TEXTURE_ADDRESS_CLAMPque sujeta los valores fuera de la gama de coordenadas de textura en la gama.

Si hay un parámetro análogo en su código, esto podría ayudar.

filtalpp
fuente
0

También tuve un problema similar con las líneas que aparecían entre mis mosaicos, pero cambiar el estado del muestreador a Point Clamp no solucionó el problema.

En cambio, descubrí que desactivar el muestreo múltiple y sincronizar la traza vertical solucionó el problema. Esto está en XNA 4.0:

public GraphicsDeviceManager _graphics;

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

Espero que esto ayude a alguien por ahí!

thegrak
fuente