วิธีซ่อนโครงร่างหลังการประมวลผลเมื่อ / ตำแหน่งที่ซ่อนตาข่าย


10

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

อย่างไรก็ตามฉันไม่สามารถซ่อนเค้าร่างเมื่อตาข่ายที่เลือกอยู่ด้านหลังตาข่ายอื่น สิ่งนี้สมเหตุสมผลสำหรับกระบวนการของฉันเนื่องจากฉันเพียงแค่สร้างโครงร่าง 2 มิติจากเฟรมบัฟเฟอร์หลังจากเรนเดอร์ส่วนที่เหลือของฉาก

การจับภาพหน้าจอสองรายการของฉันอยู่ด้านล่าง ที่แรกก็คือเค้าร่าง "ดี" ที่สองคือที่เห็นร่างอยู่เหนือตาข่ายที่บล็อกแหล่งที่มาเค้าร่าง

ป้อนคำอธิบายรูปภาพที่นี่

กระบวนการเรนเดอร์ทำงานดังนี้: 1) วาดเฉพาะอัลฟาของตาข่ายที่ไฮไลต์เพื่อบันทึกภาพเงาดำในบัฟเฟอร์เฟรม (framebuffer1)

2) ส่ง texture จาก framebuffer1 ไปยัง shader ตัวที่สองซึ่งทำการตรวจจับขอบ จับขอบใน framebuffer2

3) แสดงฉากทั้งหมด

4) แสดงพื้นผิวจาก framebuffer2 ที่ด้านบนของฉาก

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

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

ผลลัพธ์

เพื่อให้บรรลุผลนี้ฉันคิดว่าการตั้งค่ากำหนดเฉพาะในระหว่างการส่งเรนเดอร์ของวัตถุที่ไฮไลต์ที่จะวาดสีดำทั้งหมดในอัลฟาสำหรับพิกเซลที่มองเห็นได้

แนวคิดที่สองของฉันคือการใช้กระบวนการเรนเดอร์ปัจจุบันตามที่ระบุไว้ข้างต้น แต่ยังเก็บพิกัด X, Y และ Z ในช่อง R, G และ B ของ framebuffer1 เมื่อแสดงภาพเงาของตาข่ายที่เลือก การตรวจจับขอบจะดำเนินการและเก็บไว้ใน framebuffer2 แต่ฉันจะส่งค่า RGB / XYZ จากขอบของอัลฟาไปยังภาพเงา จากนั้นเมื่อเรนเดอร์ฉากฉันจะทดสอบว่าพิกัดอยู่ภายในขอบที่เก็บไว้ใน framebuffer2 หรือไม่ ถ้าเป็นเช่นนั้นฉันจะทดสอบความลึกของชิ้นส่วนปัจจุบันเพื่อตรวจสอบว่ามันอยู่ข้างหน้าหรือหลังพิกัดที่ดึงมาจากช่องสัญญาณ RGB (แปลงเป็นพื้นที่กล้อง) ถ้าแฟรกเมนต์อยู่ข้างหน้าพิกัดความลึกแฟรกเมนต์จะถูกเรนเดอร์ตามปกติ หากชิ้นส่วนอยู่ด้านหลังก็จะแสดงผลเป็นสีร่างทึบ

ฉันกำลังใช้ LibGDX สำหรับโครงการนี้และต้องการสนับสนุน WebGL และ OpenGL ES ดังนั้นจึงไม่มีวิธีแก้ปัญหาที่เกี่ยวข้องกับรูปทรงเรขาคณิตหรือฟังก์ชัน GLSL รุ่นใหม่กว่าสำหรับฉัน หากใครสามารถแสดงความคิดเห็นเกี่ยวกับแนวทางที่เสนอหรือเสนอสิ่งที่ดีกว่าฉันจะขอบคุณมันจริงๆ


ดูที่ repo ของคุณ คุณเคยพบวิธีแก้ปัญหาที่ยอมรับได้หรือไม่?
iKlsR

คำตอบ:


0

ฉันจะทำให้ฉากทั้งหมดเป็นบัฟเฟอร์ stencil ด้วยวัตถุที่ต้องการเพื่อตั้งค่าบิตและสำหรับสิ่งอื่นเพื่อทิ้ง / ลบบิต

จากนั้นกำจัดการตรวจจับขอบคุณไม่จำเป็นต้องทำเช่นนั้น แต่คุณสามารถเพิ่มขนาดบัฟเฟอร์ได้เล็กน้อย ดังนั้นแต่ละวัตถุก็จะเติบโตขึ้นเล็กน้อย

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


2
ขอบคุณสำหรับการตอบกลับ. วิธีนี้จะไม่ทำงานในปัญหาที่คล้ายกันที่มีความหนาของเค้าร่างและรูปร่างเว้าหรือไม่หากการปรับสเกลทำได้ 3 มิติ หรือปัญหาการกระจัดกระจายถ้ามันทำใน 2d และวัตถุที่ระบุไม่ได้อยู่ในศูนย์กลางของหน้าจอตาย?
nils

0

1) ในวัตถุเฟรมบัฟเฟอร์คุณสามารถเรียกใช้ laplacian shader ใน GPU เพื่อรับรูปร่าง

2) คุณต้องใช้บัฟเฟอร์ความลึกสุดท้ายเมื่อคุณวาดวัตถุของคุณใน FBO ด้วยวิธีนี้คุณจะวาดเฉพาะส่วนที่มองเห็นได้ของวัตถุของคุณใน FBO และ laplacian จะแสดงเฉพาะส่วนที่มองเห็นได้เท่านั้น


สวัสดีขอบคุณสำหรับการตอบกลับ ฉันกำลังทำสิ่งนี้เพื่อบรรลุเป้าหมายที่ฉันมี ฉันไม่คิดว่าคุณสมควรได้รับ downvote สำหรับคำตอบนี้
nils

0

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

โดยพื้นฐานแล้วคุณสร้าง stencil buffer หนึ่งของวัตถุทั้งคู่ที่เลือก (หรือวัตถุทั้งหมดที่ปิดกั้นวัตถุจริง ๆ ... แต่ฉันจะไม่กังวลเกี่ยวกับกรณีเหล่านั้นเว้นแต่ว่ามันจะเกิดขึ้นจริงมาก - ถ้าเป็นคนที่ถูกบดบังจะไม่คาดหวัง ความช่วยเหลือนี้มาก) จากนั้นและมีลายฉลุของกล่องขอบเขตสำหรับวัตถุของคุณ

ที่ควรได้รับผลกระทบที่คุณกำลังมองหา

อีกวิธีหนึ่งคุณสามารถปล่อยให้ผลลัพธ์ 'ไม่ดี' และฉันไม่คิดว่าคนส่วนใหญ่จะสนใจมากเกินไปแม้ว่ามันจะขึ้นอยู่กับข้อมูล / เกมของคุณและโดยเฉพาะอย่างยิ่งขนาดของวัตถุ

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