为什么我的瓷砖之间有线条?


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

Answers:


19

我假设尽管您的图块位置是用整数定义的,但您的相机位置可能不是。因此,如果您尝试从像素完美位置渲染像素完美位置,则采样可能会关闭,并导致图块之间出现线条。在你的SpriteBatch.Draw通话中,我建议您更改SamplerStatePointClamp确保对纹理进行逐点采样,并且应该删除这些多余的线条。

您的代码已修改:

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_UADDRESS_VADDRESS_W成员D3D11_TEXTURE_ADDRESS_CLAMP哪个夹具纹理坐标的超出范围的值成的范围内。

如果您的代码中有类似的参数,则可能会有所帮助。


0

我在瓷砖之间也出现了类似的问题,但是将采样器状态更改为Point Clamp并不能解决问题。

相反,我发现关闭多重采样并同步垂直轨迹可以解决此问题。这是在XNA 4.0中:

public GraphicsDeviceManager _graphics;

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

希望这可以帮助某人!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.