타일 ​​사이에 선이있는 이유는 무엇입니까?


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
있었다 질문이 최근에 너무 가치가 독서 할 수있는 유사한 주제에 대한이.
Andrew Russell

라인에 관한 질문을하는 동안 사이 당신의 타일이 대답했습니다, 나는 라인도 있습니다주의 당신의 타일 (예 : 나쁜 잔디 질감을). 이것도 고치려면 다음을 읽으십시오 : gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
Dan

답변:


19

타일 ​​위치가 정수로 정의되어 있지만 카메라 위치가 아닐 수도 있다고 가정합니다. 따라서 픽셀이 아닌 위치에서 픽셀이 완벽한 위치를 렌더링하려고 하면 샘플링이 해제되어 타일 사이에 선이 생길 수 있습니다. 귀하의 SpriteBatch.Draw호출 에서 텍스처가 포인트 단위로 샘플링되도록 추가 샘플 라인을 제거하도록 SamplerState 를 변경하는 PointClamp것이 좋습니다.

코드가 수정되었습니다.

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

1

DirectX 11과 비슷한 문제가 있었고 이것은 저에게 효과적이었습니다.

샘플러 상태 설명에서 텍스처 주소 모드를 변경했습니다. 텍스처 주소 모드는 Direct3D가 범위를 벗어난 텍스처 좌표로 Direct3D의 기능을 제어하는 ​​데 사용됩니다 (DirectX 11에서는 [0.0f, 1.0f]). I는 변경 ADDRESS_U, ADDRESS_V, ADDRESS_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.