Shader ที่“ ตัด” รูผ่านรูปทรงเรขาคณิตทั้งหมด


11

ฉันจะสร้าง shader ที่ "ตัด" ผ่านรูปทรงเรขาคณิตทั้งหมดโดยแสดงเฉพาะพื้นหลังการล้างใน Unity ได้อย่างไร ตัวอย่าง:

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

นั่นเป็นปริซึมในห้องกล่องสีขาวขนาดใหญ่ พื้นผิวของปริซึมเป็นเพียงการแสดงท้องฟ้าของฉาก (ท้องฟ้าเต็มไปด้วยดวงดาว) ฉันใช้กล้องหลายตัวซึ่งไม่มีประสิทธิภาพเลย ... ต้องมีวิธีการที่มีเพียงเฉดสีเท่านั้น

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


15

ตกลงคิดออกในที่สุด!

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

คุณจะเห็นว่าทรงกลมตาข่าย "ตัด" ผ่านทรงกระบอกและระนาบไปจนถึงกล่องฟ้าได้อย่างไร สิ่งนี้ทำให้ฉันใช้เวลานานกว่าที่คิดเอาไว้ แต่ต้องขอบคุณหน้า wiki ( http://wiki.unity3d.com/index.php/DepthMask ) ฉันได้รับการจัดเรียงทั้งหมด

ก่อนที่จะใช้การตั้งค่า shader ในหน้า wiki ฉันใช้กล้องสามตัวที่มีค่าสถานะการล้าง / ความลึกต่างกันเพื่อให้ได้ผลลัพธ์เดียวกัน มันใช้งานได้ แต่มันสำลักโดยรวมบน Ouya การแก้ปัญหาข้างต้นต้องใช้กล้องเดียวและทำงานได้เร็ว

ดังนั้นฉันจึงเซ็ตอัพฉากเช่นนี้ ...

  1. เพิ่ม skybox ที่สมจริง (นาซ่า)

  2. เพิ่มรูปร่างบางส่วน

  3. เพิ่มสคริปต์ SetRenderQueue ไปยังระนาบทรงกลมและรูปทรงกระบอก

  4. ตั้งค่าลำดับคิวบนทรงกลมเป็น 2999 (วัตถุอื่นอยู่ที่ 3000)

  5. จากนั้นเพิ่ม DepthMask shader ให้กับทรงกลม

แค่นั้นแหละ. คำถามใด ๆ แจ้งให้เราทราบ!


2
โอ๊ะฉันคิดถึงปัญหาในโพสต์ข้างต้นอย่างสมบูรณ์ (ฉันกำลังคิดถึงตาข่ายรูแบนบนผนัง / พื้นจริงๆ) โซลูชันที่เชื่อมโยงแสดงวัตถุ 3 มิติและวิธีแก้ปัญหาที่แสดงสำหรับกรณีนี้เป็นเรื่องง่ายมาก - สิ่งที่คุณต้องทำคือเขียน 'รู' ลงใน z-buffer โดยไม่ต้องเขียนสีใด ๆ ดึงต้น
bluescrn

@bluescrn ไม่ต้องกังวล! ฉันขอขอบคุณโพสต์รายละเอียด :)
CalebHC

2

สองตัวเลือกเพื่อให้ได้เอฟเฟกต์ที่คุณต้องการ - แต่มันมีราคา:

  • เขียนช่องลงในบัฟเฟอร์ stencil หรือช่องอัลฟาปลายทางแล้ววาด skybox สุดท้ายใช้การทดสอบ stencil ที่เหมาะสมหรือการผสม alpha และไม่มีการทดสอบ z

หรือ

  • แสดง skybox เป็นพื้นผิวในช่วงเริ่มต้นของเฟรมและฉายภาพที่ 'เรขาคณิตรูปหลุม'

ฉันสงสัยว่าต้องมีวิธีในการทำเช่นนี้โดยใช้ / ละเมิด z-buffer เช่นกัน - แต่คุณอาจต้องการทดสอบ z 'hole polygons' โดยใช้ Z จริงจากนั้นจึงเขียน Z ตัวอื่นคุณอาจใช้ หลายรอบและบัฟเฟอร์ stencil การวาดรู 3 ครั้งด้วยการตั้งค่าการเรนเดอร์แบบนี้อาจทำงานได้:

  • ผ่าน 1: ไม่มีการทดสอบ z, ลายฉลุที่ชัดเจนภายใต้ polys รู
  • ผ่าน 2: z-test ปกติ, ค่า stencil ที่เพิ่มขึ้น (เมื่อการทดสอบความลึกผ่าน)
  • ผ่าน 3: Clear Z โดยที่ stencil> 0

คุณยังคงต้องวาดตามลำดับที่เฉพาะเจาะจงก่อน - สิ่งแวดล้อมก่อนจากนั้นจึงเป็นหลุมและในที่สุดกล่องสกายบ็อกซ์ก็คงอยู่

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