ครอบคลุม - ข้อบกพร่องในอัลกอริทึม - วิธีกำจัดการใช้งาน?


10

บทนำ

เอ็นจิ้นการเรนเดอร์กราฟิกแบบเวกเตอร์หลายตัวมีข้อบกพร่องของอัลกอริทึมในตัว พวกมันแสดงรูปร่างแต่ละแบบแยกกันและ antialias โดยการคำนวณความครอบคลุมของพิกเซลแล้วประกอบมันไว้ที่ด้านบนของกันและกัน ใช่มันง่าย แต่การแก้ปัญหาที่ถูกต้องนั้นง่ายกว่า

สิ่งนี้นำไปสู่ปัญหา conflation ในขณะที่ conflates ความคุ้มครองโดยความโปร่งใส การผสมอัลฟ่าเป็นไปตามกฎที่ไม่ได้เป็นตัวแทนของสถานการณ์อย่างถูกต้องตัวอย่างเช่นถ่ายภาพพิกเซลที่ครอบคลุม 50% ที่อยู่ใกล้เคียงกับพิกเซลที่ครอบคลุม 50% ไม่ได้จบลงด้วยการครอบคลุม 100% มันจบลงด้วยความครอบคลุม 75% . สิ่งที่ดูเหมือนจะขึ้นอยู่กับวิธีการปรับอัลกอริทึมและรายละเอียดอื่น ๆ แต่ในสาระสำคัญนี่เป็นข้อผิดพลาดที่ทราบ บางคนทำปัญหาการทำเอกสารข้อผิดพลาดของเครื่องยนต์แตกต่างกันไปรวมทั้งการเขียนบทความแสดงให้เห็นว่าสามารถทำได้ดีกว่า

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

ภาพที่ 1 : ตัวอย่างที่ไม่ได้เป็นตัวแทนทั้งหมดของการเรนเดอร์รูปร่างที่ทำจากสามเหลี่ยมแสดงข้อผิดพลาดแบบขยายที่แถวบนสุด แหล่งที่มาของ SVG

ปัญหามีวิธีแก้ปัญหาที่ไม่ยุ่งยากง่าย ๆ * เป็นเพียงตัวอย่างขั้นสูงโดยไม่ต้องคำนวณการครอบคลุมและกรองภาพลง เป็นโบนัสที่คุณจะได้ใช้อัลกอริธึมการสร้างภาพที่ดีกว่าการกรองแบบกล่อง (อ่านA Pixel ไม่ใช่สี่เหลี่ยมจัตุรัส3 ) มีแม้กระทั่งโซลูชันที่มีความเร็วเทียบเคียงได้กับโซลูชันปัจจุบันและวิธีแก้ปัญหาเหล่านี้ทำได้ง่ายกว่ามากในท่อส่งแรสเตอร์ฮาร์ดแวร์

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

คำถาม

ข้อผิดพลาดเผยแพร่อย่างไร เนื่องจากพวกเขากำลังทำข้อผิดพลาดเดียวกันทั้งหมดจึงสามารถสรุปได้ว่าพวกเขาใช้แหล่งเดียวกันสำหรับอัลกอริทึมของพวกเขา สิ่งที่อาจทำให้นักออกแบบเลือกอัลกอริทึมนี้ เหตุใดโปรแกรมเมอร์ 3D เท่านั้นที่รู้จักข้อผิดพลาดนี้และแม้แต่ประมวลรหัสส่วนหนึ่งใน API และการสอนในขณะที่โปรแกรมเมอร์ 2D ไม่ได้

จะมั่นใจได้อย่างไรว่าข้อผิดพลาดนี้หยุดเผยแพร่ต่อไป?


ภาคผนวก (แต่ฉันไม่ได้ถามเกี่ยวกับเรื่องนี้)

* เห็นได้ชัดว่าการอ้างสิทธิ์ของฉันว่าการสุ่มตัวอย่างแบบพิเศษทำงานได้อย่างไร้ข้อบกพร่องเป็นพิเศษและต้องใช้การพิสูจน์พิเศษ ตกลงดังนั้นกุญแจสำคัญในการทำงานของการสุ่มตัวอย่างแบบพิเศษคือการสุ่มตัวอย่างแบบพิเศษนั้นไม่ได้ทำการประมวลผลการครอบคลุม ในสาระสำคัญตัวอย่าง super ถือว่าแต่ละตัวอย่างเป็นตัวอย่างจุด เนื่องจากตัวอย่างจุดทำให้ไม่มีสมมติฐานของพื้นที่ต้นแบบมันไม่ได้ทำให้การเปรียบเทียบอัลฟาที่มันไม่เกิดขึ้น

เพื่อให้ทำงานได้อย่างต่อเนื่องตามที่อธิบายไว้ในคำตอบข้อใดข้อหนึ่ง เราจำเป็นต้องทำการประมวลผลตัวอย่างด้วยการสุ่มตัวอย่างจำนวนเต็มเพื่อความสอดคล้อง สิ่งนี้ทำให้เรามั่นใจว่าแต่ละจุดที่เคยเปลี่ยนเป็นพื้นที่หน้าจอได้รับการแก้ปัญหาเดียวกันสำหรับพิกัดที่เท่ากันและไม่มีการแรเงาตัวอย่างโดยเส้นขอบพิกเซล 2 ครั้ง หากต้องการทำสิ่งนี้ตัวอย่างอาจไม่เปิดใช้งานพิกเซล ot อย่างแน่นอนหากเป็นตัวอย่างด้านล่างซ้ายของด้านล่าง (ดังนั้นเราจึงสร้างกฎที่ประมวลผลขอบที่แน่นอนใน> vs <=) การ์ดกราฟิกคอนโซลทั้งหมดทำงานได้อย่างนี้ ช่วยให้มั่นใจได้ว่าไม่จำเป็นต้องมีแคชข้อมูลเพิ่มเติมและไม่จำเป็นต้องทำการทดสอบใกล้เคียง โซลูชันนี้มีความเสถียรทั่วไปและสอดคล้องกว่าโซลูชันที่ครอบคลุม

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

ดังนั้นวิธีนี้มีข้อเสียหรือไม่ มันช้ากว่าหน่อยถ้าคุณแค่คิดว่าไร้เดียงสา ในทางทฤษฎีแล้วมันมีพฤติกรรมที่รวดเร็วกว่า asymptotic มากกว่า rasterizer ที่มีข่าวครอบคลุมบิตเหมือน raytracer ที่ยังคงเท่าเดิมในฉากทั่วไป นอกจากนี้มันสามารถทำให้การใช้งานของลักษณะพิเศษแบบ convolution เจ็บปวดยิ่งขึ้นในการใช้


จะเพิ่มรูปภาพสำหรับการแก้ไขของฉันเมื่อวันทำงานหมด หลังจากทั้งหมดนี้เป็นการประมวลผลกราฟิกมันมีการตีความภาพ
joojaa

คำตอบ:


6

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

และฉันคิดว่านั่นเป็นเหตุผลที่คุณกำลังมองหา: หากคุณต้องการอัลกอริทึมที่ไม่ต้องการหน่วยความจำและเวลาทำงานเพิ่มขึ้นสิ่งต่าง ๆ มีความซับซ้อนมากกว่าในแนวทาง "ความโปร่งใส" ที่ไร้เดียงสา


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

@joojaa: คุณสามารถร่างสิ่งที่คุณหมายถึงโดย "การตั้งค่าการจัดเก็บแรสเตอร์" หรือให้ลิงค์ที่อธิบายวิธีการในวิธีที่ไม่ต้องขุดตัวเองผ่านกระดาษวิทยาศาสตร์> 20 หน้า?
Doc Brown

แต่ละพิกเซลมีความเป็นอิสระจากกันดังนั้นคุณจะต้องบันทึกตัวอย่างในขณะที่คุณกำลังทำพิกเซลคุณสามารถทิ้งได้อย่างปลอดภัยหลังจากนี้ หากคุณต้องการใช้คำสั่งซื้อที่สูงกว่าคุณสามารถเก็บมุมมองที่ จำกัด ได้เท่านั้น ดังนั้นสิ่งที่คุณต้องการจริงๆที่จะทำคือการจัดสรรหน่วยความจำสำหรับแกนประมวลผลของคุณดังนั้นบางที (16-256 ไบต์ต่อด้าย)
joojaa

โอ้ขออภัยคุณไม่จำเป็นต้องเก็บตัวอย่างถ้าคุณทำกล่องกรองคุณสามารถใช้สูตรสำหรับค่าเฉลี่ยเคลื่อนที่ / วิ่งซึ่งไม่ต้องการให้คุณเก็บตัวอย่างแต่ละตัว
joojaa

@ joojaa: ฉันไม่เข้าใจ - คุณไม่จำเป็นต้องคำนวณตัวอย่างแรกของรูปร่างที่เกี่ยวข้องทั้งหมดอาจจะเป็นหลายร้อยหรือหลายพันและหลังจากนั้นกรองลงไปที่จอแสดงผลแรสเตอร์ของคุณ?
Doc Brown

6

การสุ่มตัวอย่างแบบ Supersam จะไม่ช่วยแก้ปัญหาโดยทั่วไป: จะทำให้เห็นได้ชัดน้อยลงเท่านั้น ด้วยพิกเซลที่มีขนาดครึ่งหนึ่งปัญหาจะเล็กลงอย่างเห็นได้ชัด แต่จะไม่หายไป

จุดทางสถาปัตยกรรมที่อยู่เบื้องหลังการออกแบบเหล่านี้คือเราต้องการให้คำสั่ง "render สามเหลี่ยม ABC" มีความหมายที่ชัดเจน เราไม่ต้องการให้มันคลุมเครือยกเว้นเมื่อพิจารณาว่าเป็นส่วนหนึ่งของชุดคำสั่งการวาด - ตัวอย่างเช่นมีหนึ่งความหมายเมื่อ "render สามเหลี่ยม BCD" ยังอยู่ในชุด (ด้วยสีเดียวกันหรือสีที่แตกต่าง) และความหมายอื่นเมื่อ มันไม่ใช่

ยกตัวอย่างเช่นการพิจารณาสามเหลี่ยมหนึ่งพันแม้แต่การหาสามเหลี่ยมทั้งหมดที่แบ่งปันด้านข้างหรือส่วนหนึ่งของด้านหนึ่งด้วย ABC นั้นมีการคำนวณที่หนักหน่วง (จำได้ว่ามันจะต้องทำอีกพันครั้ง) มีปัญหาในทางปฏิบัติอื่น ๆ อีกมากมายเช่นกัน: โดยเฉพาะอย่างยิ่งที่คำขอการเรนเดอร์ดั้งเดิมทั้งหมดจะต้องถูกเก็บรักษาไว้แม้ว่าพวกเขาจะถูกดึงมานานแล้วในกรณีที่พวกเขาต้องได้รับการประเมินใหม่เนื่องจากคำขอใหม่เพิ่มเติม

บรรทัดล่างคือว่าโซลูชั่นที่สอดคล้องกันอย่างสมบูรณ์ไม่สามารถทำได้ ยังมีคำถาม: เราควรพยายามปรับปรุงสถานการณ์ปัจจุบันเมื่อเราทำได้หรือไม่? โดยทั่วไปคำตอบสำหรับคำถามนั้นคือไม่การใช้โมเดลที่สอดคล้องกันอย่างสมบูรณ์แบบนั้นดีกว่าเสมอแม้ว่าตัวแบบนั้นจะมีข้อ จำกัด ที่คุณได้แสดงไว้ก็ตาม ทางเลือกจะเป็นการใช้งานที่บางครั้งทำได้ดีกว่าและบางครั้งก็ทำไม่ได้โดยไม่มีทางที่โปรแกรมเมอร์จะรู้ว่าสองสิ่งนี้จะเป็นอย่างไรในกรณีใด ๆ ยิ่งไปกว่านั้นมันสามารถข้ามจาก "ทำดีกว่า" เป็น "ไม่ทำได้ดีกว่า" อันเป็นผลมาจากการเปลี่ยนแปลงเล็ก ๆ ของโปรแกรมเมอร์ - หรือเป็นผลมาจากการที่อยู่นอกการควบคุมของโปรแกรมเมอร์ ความสามารถในการคาดการณ์ในบริบทการเขียนโปรแกรมอยู่ไกล


นี่เป็นปัญหาของการคำนวณความครอบคลุมถ้าการยกตัวอย่างของฉันไม่ทำการคำนวณความครอบคลุมแล้วมันจะไม่มีปัญหาเพราะมันจะรวมเข้ากับคำตอบเรียไม่ใช่แค่ลดปัญหา คุณต้องการรหัสเพื่อพิสูจน์สิ่งนี้หรือไม่? นี่คือการทำงานของการ์ดกราฟิกของคุณและมันไม่ได้รับปัญหานี้ ไม่เช่นนั้นทุกเกมที่คุณเห็นจะมีปัญหา ฉันไม่ได้ซื้อคำตอบนี้เพราะมันใช้ตรรกะผิด ๆ
joojaa

@joojaa เกมไม่ใช้ anti-aliasing หรือใช้ super-sampling สำหรับ anti-aliasing ซึ่งจะมีสี่ระดับของ anti-aliasing สิ่งนี้ไม่ดีพอสำหรับกราฟิกคุณภาพงานนำเสนอที่คุณต้องการประมาณ 64 ระดับสำหรับการลบรอยหยัก ดังนั้นเกมที่แลกเปลี่ยนปัญหาหนึ่งกับอีกเกมหนึ่ง
Pete Kirkham

@PeteKirkham ขึ้นอยู่กับการตั้งค่าของคุณบางเกมอนุญาตให้คุณระบุจำนวนตัวอย่าง อย่างไรก็ตามคุณไม่ต้องการตัวอย่างมากกว่า 16 ตัวอย่างในการสร้างระดับการนำเสนอ AA หากคุณใช้ตัวกรองคำสั่งซื้อที่สูงกว่าการกรองแบบกล่อง สังเกตภาพไม่มีข้อผิดพลาดในตัวอย่างของฉันทำได้โดย supersampling ภายใน reasterizer ฮาร์ดแวร์
joojaa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.