สั่งความโปร่งใสอิสระในระบบอนุภาค


9

ฉันกำลังเขียนระบบอนุภาคและต้องการหาเคล็ดลับในการผสมอัลฟาที่เหมาะสมโดยไม่ต้องคัดแยกอนุภาคเพราะ:

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

การทดสอบอัลฟ่าดูเหมือนว่าจะเร็วพอสำหรับ GLES 2.0 และทำงานได้ดีสำหรับพื้นผิวที่ไม่โปร่งใส แต่มีการ "ปกปิด" ถึงกระนั้นก็ยังไม่เพียงพอสำหรับอนุภาคกึ่งโปร่งใส

คุณจะจัดการกับสิ่งนี้อย่างไร


มันมีความสำคัญขนาดไหนที่พวกมันถูกจัดเรียงอย่างเหมาะสม? คุณเคยเห็นสิ่งประดิษฐ์ (สำคัญ) ใด ๆ โดยใช้การผสมวานิลลาหรือไม่?
ChrisE

อนุภาคสามารถผสมกับพื้นหลังแทนที่จะเป็นอนุภาคอื่นและจากนั้น "สี่เหลี่ยมผืนผ้า" สาระสำคัญของจุดสไปรท์เป็นที่สังเกตได้อย่างชัดเจน การทดสอบอัลฟ่าช่วยได้ที่นี่ แต่สิ่งประดิษฐ์ยังคงสามารถสังเกตเห็นได้เมื่อค่าอัลฟาเงียบต่ำ แต่ไม่เพียงพอที่จะทิ้งส่วน
Stepan Zastupov

6
คุณได้ลองใช้การเขียนเชิงลึก (ไม่เปิดการทดสอบเชิงลึก) เมื่อเรนเดอร์อนุภาคหรือไม่? ควรทำให้การสั่งซื้อที่ไม่ถูกต้องชัดเจนน้อยลง
Adam

2
หลังจากการทดลองบางอย่างฉันพบว่าการปิดใช้งานการเขียนเชิงลึกเป็นวิธีแก้ปัญหาที่ดีที่สุดในกรณีส่วนใหญ่
Stepan Zastupov

คำตอบ:


10

นี่คือสิ่งที่ฉันจะทำ

ขั้นตอนที่ 1: อย่าเรียงลำดับ แค่ทำมัน. ดูว่าเป็นปัญหาหรือไม่ มีโอกาสมากที่สุดไม่ใช่

ขั้นตอนที่ 2: จำกัด อนุภาคลงในสิ่งที่ไม่ต้องการจัดเรียงเช่น:

  • เพียงแค่ของแข็ง (อาจเป็นไปได้ว่าอัลฟ่าถึงขอบครอบคลุม)

    • ให้ zbuffer ดูแลการเรียงลำดับ
  • เพียงแค่บิตเพิ่มเติม

    • a + b = b + a ดังนั้นคำสั่งซื้อไม่สำคัญ

ขั้นตอนที่ 3: หากต้องการมากกว่านั้นให้แบ่งการเรนเดอร์อนุภาคเป็นบิตที่ต้องอยู่ด้านหน้าและส่วนที่เหลือและทำการเรนเดอร์ในหลายรอบ (อาจแก้ไขควันที่ซับซ้อนได้เป็นต้น)

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

อะไรเพิ่มเติมจะต้องมีข้อมูลเพิ่มเติมเกี่ยวกับกรณีการใช้งานเฉพาะของคุณ แต่ฉันค่อนข้างมั่นใจว่าคุณไม่จำเป็นต้องมีความเป็นอิสระในการสั่งซื้อ เพียงใช้อนุภาคมากพอในการสุ่มพอและมันจะ ok =)


6

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


5

การใช้คำสั่งผสมเพิ่มเติมไม่สำคัญ:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

นี่จะถือว่าพื้นผิวเทพดาของคุณมีพื้นหลังโปร่งใส

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