ฉันส่วนใหญ่ประสบความสำเร็จในการย้ายการดำเนินการของ Marching Cubes จากซีพียูไปสู่การคำนวณด้วย OpenGL แต่ฉันยังไม่ได้แก้ไขกฎเกณฑ์บรรทัดฐานและสงสัยว่าวิธีที่ดีที่สุดจะไปเกี่ยวกับเรื่องนี้
ข้อตกลงการใช้งานของฉันเป็นการเฉพาะกับเขตข้อมูลมูลค่าไบนารี (ฉันกำลังพยายามจำลองฟังก์ชันเศษส่วน 3 มิติที่ยังไม่มีเครื่องมือประมาณระยะทาง) ดังนั้นวิธีการไล่ระดับสีและการส่งต่อความแตกต่างจะไม่ทำงาน ฉันใช้จุดสูงสุดร่วมกันและการใช้งาน CPU ของฉันใช้วิธีของ Quilez ตามที่อธิบายไว้ที่นี่เพื่อรวบรวมหน้าตามาตรฐานลงบนจุดสุดยอดแต่ละแห่ง
ฉันสามารถนำการติดตั้งนี้ไปใช้กับ shader อื่นได้ แต่ปัญหาที่ฉันเห็นด้วยนี่คืออะตอมมิกจำนวนมากที่ต้องการ เนื่องจากเราสามารถใช้ atomics กับชนิดจำนวนเต็มสเกลาร์เท่านั้นและฉันไม่สามารถคิดวิธีที่จะแพ็ค 3 ลงนาม ints เป็น 1 ในทางที่สรุปได้ซึ่งหมายความว่า 3 แกน * 3 จุดยอด = 9 อะตอมเพิ่มการเรียกต่อ shader แน่นอนว่ามันจะกระจายไปทั่วหน่วยความจำดังนั้นจึงไม่เหมือนกับการกดอะตอมมิกเคาน์เตอร์เดียว 9 ครั้ง แต่มันก็ดูเหมือนว่าจะเป็นนรกมาก
อีกทางเลือกหนึ่งคือการเรียกใช้ shader ต่อรูปหลายเหลี่ยมและสร้างรายการปกติของใบหน้า (ฉันอาจแพ็ค x10y10z10 ด้วยวิธีนี้) จากนั้น shader ต่อจุดสุดยอดเพื่อสะสมบรรทัดฐานทั้งหมดของใบหน้าที่อยู่ใกล้เคียง นี่จะเป็นหมูหน่วยความจำขนาดใหญ่แม้ว่าพื้นที่จัดเก็บของดัชนีใบหน้าจะต้อง 12 int ต่อจุดสุดยอดเพื่อจัดการกับกรณีที่เลวร้ายที่สุด นอกจากนี้ยังมีปัญหาวิธีการเขียนลงในที่เก็บข้อมูลนี้โดยไม่ต้องหันไปใช้อะตอมมิกอีกครั้งเพื่อหาจำนวนใบหน้าที่ถูกเขียนไปยังจุดสุดยอดแล้ว
ใครมีแนวคิดที่ดีกว่าเกี่ยวกับวิธีการทำเช่นนี้?