ฉันจะใช้ anti-aliasing ใน OpenGL ได้อย่างไร


28

ฉันต้องการทำ anti-aliasing แบบเต็มหน้าจอใน OpenGL และไม่ต้องการใช้ anti-aliasing ที่ OpenGL จัดทำขึ้นเองเนื่องจากฉันกำลังสร้างเกมและต้องการเอฟเฟกต์ดีๆ

ฉันควรดำเนินการอย่างไร


โดย "การลบรอยหยักที่จัดทำโดย GL เอง" คุณอ้างถึงคำแนะนำเกี่ยวกับคุณภาพของเส้นและรูปหลายเหลี่ยมที่มีชื่อเก่าและไม่ดีซึ่งมีป้ายกำกับว่า "การลดรอยหยัก" หรือคุณอ้างถึงการใช้ MSAA ปกติผ่านภาพ GLX / WGL
Lars Viklund

คำตอบ:


28

มีหลายทางเลือกให้กับ MSAA ดั้งเดิมใน OpenGL ด้วยเอฟเฟ็กต์หลังการประมวลผลสิ่งที่ดีที่สุดเกี่ยวกับพวกเขาก็คือโดยปกติแล้วคุณสามารถโยน shader ไปยังรูปภาพสุดท้ายที่ยังไม่ผ่านการประมวลผล นี่คือสามวิธีที่ควรค่าแก่การดู:

  • Anti-Aliasing (Geeks3D) ที่รวดเร็วโดยประมาณ - ดีในกรณีส่วนใหญ่ สวยง่ายต่อการใช้และทำความเข้าใจ ข้อเสียคือเสียงรบกวนที่คมชัดสูงในพื้นผิวจะเบลอเล็กน้อย เพิ่มความละเอียดเป็น 1/4 พิกเซลที่ดูสมจริงและแม่นยำเหมือน MSAA แบบดั้งเดิม น้อยกว่าที่ชันมากมันเสียความแม่นยำไปหน่อย

  • Anti-Aliasing แบบกรองปกติ (GameDev ) - ยังไม่ได้ทดสอบอันนี้อย่างถูกต้อง แต่มันง่ายที่สุดที่จะเข้าใจ ในกรณีที่ดีที่สุดมันคล้ายกับ 16x MSAA และในกรณีที่เลวร้ายที่สุดก็เหมือน 2x MSAA มันสร้างแผนที่ปกติชั่วคราวเพื่อเป็นตัวแทนของขอบและมุมญาติ คุณสามารถลองแผนที่ปกติด้วยความแตกต่างของลูม่าหรือความแตกต่างของสี

  • Morphological Anti-Aliasing (Iryoku) - ได้รับการปรับปรุงให้เป็น SMAA - Subpixel Mophological AA มันค่อนข้างซับซ้อนที่ 4 รอบ แต่ได้ผลลัพธ์ที่ดีที่สุดที่ฉันเคยเห็น มันสร้างการไล่ระดับสีตามขอบอย่างค่อยเป็นค่อยไปเป็น 1/100 ถึง 1/200 พิกเซลชัน (!) การสุ่มตัวอย่างสามารถเป็น luma-based, color-based หรือ depth-based พื้นผิวอยู่ในกรอบและสะอาดมาก (ตัวอย่างคือ DX10 และ HLSL ที่ใช้จะใช้เวลาพอสมควรในการพอร์ตกับ GLSL อย่างถูกต้อง)

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

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


7

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

อีกวิธีคือใช้การลดรอยหยักโพสต์การประมวลผลที่คุณแสดงฉากตามปกติแล้วทำการเบลอเป้าหมายในผลลัพธ์สุดท้ายเพื่อซ่อนขอบ aliased มีเทคนิคที่หลากหลายสำหรับสิ่งนี้ แต่หนึ่งในสิ่งที่ดีที่สุด / เป็นที่นิยมมากที่สุดในขณะนี้คือ FXAA (Fast approXimate Anti-Aliasing)

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

คุณสามารถค้นหาข้อมูลที่เฉพาะเจาะจงเกี่ยวกับการนำ MSAA หรือ FXAA ไปใช้บนเว็บได้เพียงแค่ google คำใดคำหนึ่งเหล่านั้น


2

คุณยินดีที่จะเขียนโปรแกรมรหัส GLSL ของคุณเองหรือไม่? ถ้าเป็นเช่นนั้นตรวจสอบการกวดวิชานี้


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