ทำไมจึงมีเส้นคั่นระหว่างกระเบื้องของฉัน


14

ฉันกำลังสร้างเกมบน XNA แผนที่ถูกสร้างขึ้นโดยไทล์ ปัญหาที่ฉันสังเกตเห็นเมื่อเร็ว ๆ นี้คือ 'เส้นตาราง' ของเส้นแบ่งระหว่างแผ่นกระเบื้อง มันจะปรากฏขึ้นบางครั้งเท่านั้นและขึ้นอยู่กับตำแหน่งของกล้อง ฉันปล่อยให้ XNA จัดการตำแหน่งทำไมเส้นเหล่านี้ถึงปรากฏขึ้น

นี่คือภาพที่มีเส้น:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามหลังจากที่ขยับกล้องของฉันไปเพียงเล็กน้อยมันน่าอัศจรรย์ที่จะกลับไปสู่ลักษณะที่ควรจะปรากฏขึ้น:

ป้อนคำอธิบายรูปภาพที่นี่

ขอบคุณสำหรับความช่วยเหลือใด ๆ !

แก้ไข:

นี่คือสิ่งที่ดีที่สุดที่ฉันสามารถทำได้สำหรับซอร์สโค้ดนี่เป็นโครงการขนาดใหญ่มากและการเรนเดอร์มันทำได้หลายด้าน:

Main Render Loop สำหรับองค์ประกอบแบบไดนามิกเช่นไทล์:

    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 ทำกับพิกัดพื้นผิวที่อยู่นอกช่วง (ใน DirectX 11 นี่คือ[0.0f, 1.0f]) ผมเปลี่ยนADDRESS_U,ADDRESS_V , ADDRESS_WสมาชิกD3D11_TEXTURE_ADDRESS_CLAMPที่หนีบค่าออกจากช่วงของเนื้อพิกัดลงในช่วง

หากมีพารามิเตอร์แบบอะนาล็อกในรหัสของคุณมากกว่านี้อาจช่วยได้


0

ฉันมีปัญหาคล้ายกันกับเส้นที่แสดงระหว่างไทล์ของฉันด้วย แต่การเปลี่ยนสถานะตัวอย่างเป็น Point Clamp ไม่ได้แก้ปัญหา

แต่ฉันพบว่าการปิดการสุ่มตัวอย่างหลายครั้งและการซิงโครไนซ์การติดตามแนวตั้งช่วยแก้ไขปัญหาได้ นี่คือใน 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.