タイルの間に線があるのはなぜですか?


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öw12年

1
あった質問だけで、最近の価値があまりにも読んでも同様のトピックに関するが。
アンドリューラッセル

タイル間の線についての質問には答えましたが、タイルにも線があります(つまり、悪い草のテクスチャ)。あなたもそれを修正したい場合は、これを読んでください:gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php-
ダン

回答:


19

タイルの位置は整数で定義されていますが、カメラの位置はそうではないかもしれません。あなたからピクセル完璧なポジションをレンダリングしようとしているのであれば -pixel、完璧な位置、その後サンプリングがオフになるとタイルの間の線の原因となります。あなたの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_UADDRESS_VADDRESS_WメンバーにD3D11_TEXTURE_ADDRESS_CLAMPその範囲内にテクスチャ座標の範囲外の値をクランプします。

コードに類似したパラメーターがある場合、これが役立つ場合があります。


0

タイル間にも線が表示されるという同様の問題がありましたが、サンプラーの状態をポイントクランプに変更しても問題は解決しませんでした。

代わりに、マルチサンプリングをオフにして垂直トレースを同期すると、問題が解決することがわかりました。これはXNA 4.0に含まれています。

public GraphicsDeviceManager _graphics;

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

これが誰かに役立つことを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.