XNA การเพิ่มหลุมอุกกาบาต (ผ่าน GPU) พร้อมเอฟเฟกต์“ Burn”


11

ขณะนี้ฉันกำลังทำงานกับโคลน "Worms" 2D ใน XNA และหนึ่งในคุณสมบัติคือภูมิประเทศ "deformable" (เช่นเมื่อจรวดชนกับภูมิประเทศมีการระเบิดและก้อนภูมิประเทศหายไป)

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

ฉันรู้ว่านี่ไม่ใช่วิธีที่ดีที่จะทำไม่ใช่เพียงเพราะฉันได้อ่านเกี่ยวกับแผงลอยไปป์ไลน์และเช่นนั้น แต่ยังเพราะมันอาจกลายเป็นเรื่องที่ค่อนข้างล้าหลังหากมีการเพิ่มหลุมอุกกาบาตจำนวนมากในเวลาเดียวกัน ฉันต้องการสร้าง Crater Generation ของฉันใหม่บน GPU แทนที่จะใช้ Render Targets "ping-ponging" ระหว่างการเป็นเป้าหมายและพื้นผิวเพื่อปรับเปลี่ยน นั่นไม่ใช่ปัญหาฉันรู้วิธีการทำ ปัญหาคือฉันไม่รู้วิธีเก็บเบิร์นเอฟเฟกต์ด้วยวิธีนี้

นี่คือลักษณะการเบิร์นของผลตอนนี้:

ผลการเผาไหม้

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


สิ่งนี้อาจช่วยได้: gamedev.stackexchange.com/q/6721/1163
Adam Harte

คำตอบ:


7

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

เมื่อมีการระเบิดให้วาดวงกลมบนพื้นผิวความเสียหายที่มีขอบโปร่งใสเล็กน้อย นี่จะเป็นพื้นที่ "เบิร์น"

เมื่อใดก็ตามที่คุณวาดภูมิประเทศให้ GPU ทั้งพื้นผิวและให้ shader คูณสี (.rgb) ของพิกเซลพื้นหลังด้วย 1 - ค่าอัลฟาของพื้นผิวที่เสียหาย กำจัดพิกเซลสีดำทั้งหมด (อัลฟาพวกเขาเป็น 0 หรือคุณสามารถคูณนี้เป็นอัลฟาเช่นกัน (.rgba แทนที่จะเป็น. rgb) ขึ้นอยู่กับว่าคุณต้องการพื้นที่ที่ไหม้เกรียมโปร่งแสง) และ voila!

ฉันสงสัยว่านี่เป็นทางออกที่ดีที่สุดแต่ก็ค่อนข้างคล้ายกับสิ่งที่คุณทำมาก่อนซึ่งอาจทำให้การถ่ายโอนง่ายขึ้น คุณอาจจะรอดพ้นจากการผ่านไปในอาร์เรย์ของ Vector3 (x, y, รัศมี) และทำคณิตศาสตร์บางอย่างใน shader ตามจุดระเบิดเหล่านั้น แต่ฉันไม่แน่ใจเกี่ยวกับประสิทธิภาพของมัน

หวังว่านี่จะช่วยได้!


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