T-junctions ในตาข่ายส่งผลให้เกิดรอยแตก?


19

ฉันได้ยินมาจากหลายแหล่งที่มีรอยต่อ T-in ใน 3D meshes เป็นความคิดที่ไม่ดีเพราะมันอาจส่งผลให้เกิดรอยแตกในระหว่างการเรนเดอร์ บางคนสามารถอธิบายได้ว่าทำไมมันถึงเกิดขึ้นและสิ่งหนึ่งที่สามารถทำได้เพื่อหลีกเลี่ยงพวกเขา?


ดูstackoverflow.com/questions/21593786/...
lhf

คำตอบ:


20

คำตอบของ lhf นั้นดีจากมุมมองของ tessellation แต่สิ่งเหล่านี้สามารถเกิดขึ้นได้กับกรณีการใช้ตาข่ายสามเหลี่ยมที่ง่ายขึ้น

ใช้ตัวอย่างเล็กน้อยนี้ของสามสามเหลี่ยมพื้นที่หน้าจอ , ABC, ADE และ DBE ...

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

แม้ว่าจุด E นั้นในทางคณิตศาสตร์มีจุดประสงค์เพื่อให้อยู่ในส่วนของเส้นตรง AB ท่อส่งจะไม่ใช้ค่าที่แม่นยำอย่างเต็มที่เช่นตัวเลขที่มีเหตุผล (เช่นhttps://gmplib.org/ ) แต่น่าจะเป็นการใช้แบบลอยตัวดังนั้นจะมีการนำเสนอการประมาณ / ข้อผิดพลาดบางอย่าง ผลลัพธ์อาจเป็นดังนี้:

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

โปรดทราบว่าทั้งหมดของจุดอาจจะมีความไม่ถูกต้อง แม้ว่าตัวอย่างข้างต้นแสดงให้เห็นถึงรอยร้าว T-junction อาจส่งผลให้เกิดการทับซ้อนตามขอบทำให้พิกเซลถูกวาดสองครั้ง สิ่งนี้อาจดูไม่ดี แต่อาจทำให้เกิดปัญหากับการดำเนินงานที่โปร่งใสหรือมีลายฉลุ

จากนั้นคุณอาจคิดว่าจุดลอยตัวข้อผิดพลาดที่นำเสนอจะไม่มีนัยสำคัญ แต่ในโหมดแสดงภาพค่าจุดยอดพื้นที่หน้าจอ (X, Y) จะแสดงเกือบทุกครั้งด้วยหมายเลขจุดคงที่และการเคลื่อนที่จากตำแหน่งในอุดมคติ มักจะมากขึ้น ยิ่งไปกว่านั้นเมื่อฮาร์ดแวร์การเรนเดอร์ "interpolates" ส่วนของเส้นพิกเซลต่อพิกเซลด้วยความแม่นยำภายในของตัวเองจึงมีโอกาสมากขึ้นที่มันจะแตกต่างจากตำแหน่งโค้งมนของ E

ถ้าทางแยกถูก "ลบ" โดยให้แบ่ง ABC ABC เป็นสองส่วนด้วยกันเช่น AEC และ EBC ปัญหาจะหายไปเมื่อการเปลี่ยนแปลงที่เกิดจากข้อผิดพลาดนั้นสอดคล้องกันทั้งหมด

ทีนี้คุณอาจถามว่าทำไมตัวเรนเดอร์ (โดยเฉพาะ HW) ใช้คณิตศาสตร์แบบจุดคงที่สำหรับพิกัดจุดสุดยอด XY? ทำไมพวกเขาไม่ใช้เลขทศนิยมเพื่อลดปัญหา? แม้ว่าบางคนทำ (เช่น Sega's Dreamcast) แต่ก็สามารถนำไปสู่ปัญหาอื่นได้ซึ่งการตั้งค่าทางคณิตศาสตร์ของสามเหลี่ยมนั้นไม่ถูกต้องอย่างหายนะโดยเฉพาะอย่างยิ่งสำหรับรูปสามเหลี่ยมยาวบาง ๆ


2
เมื่อคุณพูดว่า "จุดสุดยอด (X, Y) ค่าจะถูกแทนด้วยจำนวนจุดคงที่เสมอ" ฉันเดาว่าคุณหมายถึงพิกัดจุดสุดยอดพื้นที่หน้าจอในตัวแรสเตอร์เซอร์ใช่ไหม? ไม่ใช่จุดยอดพื้นที่ต้นแบบ
นาธานรีด

2
@NathanReed ใช่ เพียงแค่ X-Y space-screen (และอาจใช้กับ GPU บางตัวใน Z) ฉันจะแก้ไขเพื่อให้ชัดเจนยิ่งขึ้น
Simon F

9

เมื่อสร้างแบบจำลองพารามิเตอร์พื้นผิวด้วยตาข่ายในโดเมนพารามิเตอร์ส่วนแยกอาจจะปรากฏเป็นความไม่ต่อเนื่องในพื้นผิว สิ่งเหล่านี้จะปรากฏเป็นช่องว่างในการแสดงผล ดูด้านล่าง

โดยทั่วไป T-junctions ในตาข่ายรูปสามเหลี่ยมอาจส่งผลให้เกิดความไม่ต่อเนื่องของคุณลักษณะที่ถูกแก้ไขเช่นสีและบรรทัดฐาน

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


ดูยังstackoverflow.com/questions/23530807/...
lhf

4

ข้อผิดพลาดในการปัดเศษทศนิยม

หลังจากที่คุณแปลงทางแยก T และจุดใน T สามารถปัดเศษจากขอบ

จากนั้นอาจเกิดขึ้นได้ว่าชิ้นส่วนที่ได้รับตัวอย่างสำหรับพิกเซลอยู่ในช่องว่างระหว่างพื้นผิวทั้งสอง

สิ่งนี้สามารถแก้ไขได้โดยไม่ต้องมี T-junction ในตอนแรก


3

วิธีที่ง่ายที่สุดในการหลีกเลี่ยงปัญหานี้คือการทำให้แน่ใจว่าทุกอย่างมีการเชื่อมของคุณ

ปัญหาของคุณคือคุณมีการตัดตามขอบด้วยจุดยอด แต่คุณไม่มีจุดสุดยอดที่สอดคล้องกันบนขอบที่อยู่ติดกันเพื่อเชื่อม / เชื่อมต่อกับถ้าคุณคิดว่ามันเหมือนปุ่มบนเสื้อคุณได้หว่านลงบน ปุ่มไปที่ขอบ แต่ไม่ได้ให้รูเพื่อให้ผ้าเปิด

ในภาพด้านล่างจุดสีแดงแสดงจุดเชื่อมที่ถูกต้องจุดสีฟ้าทั้งหมดต้องมีจุดยอดเพิ่มเติมเพื่อตัดเข้าหาขอบที่อยู่ติดกัน

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

โดยทั่วไปแล้วมันเป็นการปฏิบัติที่ดีที่จะรักษาแบบจำลองของคุณให้อยู่ในรูปของควอด & ไตรส่วนนี้จะช่วยบรรเทาปัญหานี้ได้เนื่องจากคุณควรมีจุดสุดยอดที่สอดคล้องกันเพื่อเชื่อมด้วยเช่นกัน นอกจากนี้ยังช่วยในการล่ามถ้าคุณวางแผนที่จะใช้วิธีการจัดสรรใด ๆ ในตาข่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.