การสร้างบรรทัดฐานยอดที่ใช้ร่วมกันบน GPU


9

ฉันส่วนใหญ่ประสบความสำเร็จในการย้ายการดำเนินการของ Marching Cubes จากซีพียูไปสู่การคำนวณด้วย OpenGL แต่ฉันยังไม่ได้แก้ไขกฎเกณฑ์บรรทัดฐานและสงสัยว่าวิธีที่ดีที่สุดจะไปเกี่ยวกับเรื่องนี้

ข้อตกลงการใช้งานของฉันเป็นการเฉพาะกับเขตข้อมูลมูลค่าไบนารี (ฉันกำลังพยายามจำลองฟังก์ชันเศษส่วน 3 มิติที่ยังไม่มีเครื่องมือประมาณระยะทาง) ดังนั้นวิธีการไล่ระดับสีและการส่งต่อความแตกต่างจะไม่ทำงาน ฉันใช้จุดสูงสุดร่วมกันและการใช้งาน CPU ของฉันใช้วิธีของ Quilez ตามที่อธิบายไว้ที่นี่เพื่อรวบรวมหน้าตามาตรฐานลงบนจุดสุดยอดแต่ละแห่ง

ฉันสามารถนำการติดตั้งนี้ไปใช้กับ shader อื่นได้ แต่ปัญหาที่ฉันเห็นด้วยนี่คืออะตอมมิกจำนวนมากที่ต้องการ เนื่องจากเราสามารถใช้ atomics กับชนิดจำนวนเต็มสเกลาร์เท่านั้นและฉันไม่สามารถคิดวิธีที่จะแพ็ค 3 ลงนาม ints เป็น 1 ในทางที่สรุปได้ซึ่งหมายความว่า 3 แกน * 3 จุดยอด = 9 อะตอมเพิ่มการเรียกต่อ shader แน่นอนว่ามันจะกระจายไปทั่วหน่วยความจำดังนั้นจึงไม่เหมือนกับการกดอะตอมมิกเคาน์เตอร์เดียว 9 ครั้ง แต่มันก็ดูเหมือนว่าจะเป็นนรกมาก

อีกทางเลือกหนึ่งคือการเรียกใช้ shader ต่อรูปหลายเหลี่ยมและสร้างรายการปกติของใบหน้า (ฉันอาจแพ็ค x10y10z10 ด้วยวิธีนี้) จากนั้น shader ต่อจุดสุดยอดเพื่อสะสมบรรทัดฐานทั้งหมดของใบหน้าที่อยู่ใกล้เคียง นี่จะเป็นหมูหน่วยความจำขนาดใหญ่แม้ว่าพื้นที่จัดเก็บของดัชนีใบหน้าจะต้อง 12 int ต่อจุดสุดยอดเพื่อจัดการกับกรณีที่เลวร้ายที่สุด นอกจากนี้ยังมีปัญหาวิธีการเขียนลงในที่เก็บข้อมูลนี้โดยไม่ต้องหันไปใช้อะตอมมิกอีกครั้งเพื่อหาจำนวนใบหน้าที่ถูกเขียนไปยังจุดสุดยอดแล้ว

ใครมีแนวคิดที่ดีกว่าเกี่ยวกับวิธีการทำเช่นนี้?

คำตอบ:


5

สำหรับวิธีแก้ปัญหาของ nVidia คุณสามารถใช้ floating point atomic add intrinsics (เช่น NvInterlockedAddFp32) การปลดล็อก GPU Intrinsics ใน HLSL | ผู้พัฒนา NVIDIA

ฉันลองสิ่งนี้บน 80,000 vertex mesh และมันค่อนข้างเร็ว (เช่น 1 หรือ 2 ms ใน GTX980M ถ้าจำได้ถูกต้อง)

เพียงระวังการรวบรวมเฉดสีของคุณให้เป็นอิสระเพื่อให้อินทิลิตี้ทำงานได้ (เนื่องจากข้อบกพร่อง / ข้อ จำกัด ของ NVIDIA)

นอกจากนี้ระวังการแยกจุดยอด (เนื่องจากความไม่ต่อเนื่องของ UV) คุณจะต้องจัดการกับมันมิฉะนั้นคุณจะมีขอบแข็งที่ไม่ต้องการที่ตะเข็บ UV


เพราะคำถามเก่าฉันจะขอให้คุณแทน :-) สำหรับสิ่งที่ฉันเข้าใจเพียงแค่การมีข้อมูล adjencency สำหรับแต่ละจุดสุดยอดนั้นไม่ดีพอสำหรับความวุ่นวาย
Andreas

นี่เป็นโครงการวิทยานิพนธ์ของฉันเมื่อปีที่แล้วฉันลงเอยด้วยวิธีโง่เง่าและการใช้เลขอะตอมจำนวนเต็มบวกขนาดเพิ่มขึ้นเพื่อเพิ่มความแม่นยำสูงสุดจากนั้นปรับเป็นเวกเตอร์ลอยตัวให้เป็นมาตรฐาน ไม่สามารถหาวิธีในการแสดงรายการใบหน้าแต่ละจุดสุดยอดโดยไม่ต้องจัดสรรพื้นที่กรณีที่เลวร้ายที่สุดและใช้ตัวนับอะตอมเพื่อสร้างรายการต่อไป อาจไม่มีประสิทธิภาพเหมือนนรก แต่ฉันยังคงได้รับคำสั่งการเร่งความเร็วขนาดสองสามรุ่นจากซีพียูและเครื่องหมายชั้นหนึ่งดังนั้นฉันจึงมีความสุขมากกับมัน :)
russ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.