บัฟเฟอร์ลายฉลุคืออะไร?


26

วิกิพีเดียระบุว่า stencil buffer เป็น shader ที่สามารถใช้ได้

อย่างไรก็ตามมันบอกเป็นนัย ๆ ว่ามันถูกใช้สำหรับการตัดหรือมิฉะนั้น "ผูกพันอย่างแน่นหนา" ความลึกและบัฟเฟอร์พิกเซลซึ่งขัดแย้งกับตัวเองเล็กน้อย

บัฟเฟอร์ stencil ทำอะไรได้จริงและมีการใช้งานจริงในแอพพลิเคชั่นสมัยใหม่อย่างไร

คำตอบ:


31

คำจำกัดความของ stencil buffer โดย Wikipedia นั้นไม่ค่อยดีนัก แต่ก็เน้นไปที่รายละเอียดของการใช้งานที่ทันสมัย ​​(OpenGL) มากเกินไป ฉันพบว่ารุ่นที่ไม่เข้าใจง่ายเข้าใจง่ายขึ้น:

stencil คือเทมเพลตที่ใช้ในการวาดหรือระบายสีตัวอักษรสัญลักษณ์รูปร่างหรือรูปแบบที่เหมือนกันทุกครั้งที่ใช้ การออกแบบที่ผลิตโดยแม่แบบดังกล่าวเรียกว่าลายฉลุ

นั่นคือสิ่งที่ stencil หมายถึงก่อนคอมพิวเตอร์กราฟิกส์ หากคุณพิมพ์stencilบน Google Images นี่เป็นหนึ่งในผลลัพธ์แรก:

หน้ากากลายฉลุ

อย่างที่คุณเห็นมันเป็นเพียงหน้ากากหรือลวดลายที่สามารถใช้เพื่อ "ระบายสี" ลบของลวดลายลงบนบางสิ่ง

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


เมื่อพูดถึงการนำบัฟเฟอร์ stencil มาใช้บางครั้งมันจะมาพร้อมกับบัฟเฟอร์ความลึก ฮาร์ดแวร์กราฟิกส่วนใหญ่ใช้บัฟเฟอร์ stencil 1 ไบต์ (8 บิต) ซึ่งเพียงพอสำหรับการใช้งานส่วนใหญ่ บัฟเฟอร์ความลึกมักจะใช้งานโดยใช้ 3 ไบต์ (24 บิต) ซึ่งโดยปกติจะเพียงพอสำหรับการเรนเดอร์ 3D เกือบทุกชนิด ดังนั้นจึงเป็นเหตุผลที่จะแพ็ค 8 บิตของบัฟเฟอร์ stencil กับอีก 24 ของบัฟเฟอร์ความลึกทำให้เป็นไปได้ที่จะเก็บแต่ละพิกเซลความลึก + stencil ลงในจำนวนเต็ม 32 บิต นั่นคือความหมายของ Wikipedia โดย:

บัฟเฟอร์ความลึกและบัฟเฟอร์ลายฉลุมักใช้พื้นที่เดียวกันใน RAM ของฮาร์ดแวร์กราฟิก


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


มันเป็นหนึ่งในตัวละคร แต่->cleaver cleverฉันไม่สามารถแก้ไขได้ D: คำตอบที่ยอดเยี่ยมโดยวิธีการนี้ทำให้รู้สึกถึงที่สุด
Qix

3
หากคุณมี shader ต่อพิกเซลที่มีราคาแพงบัฟเฟอร์ stencil สามารถใช้เพื่อจัดกลุ่มเธรดที่คล้ายกันลดความแตกต่างและเพิ่มจำนวนผู้เข้าพักเช่นเดียวกับในกระดาษ OIT วินาที 2.6 (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียน)
jozxyqk

@jozxyqk นั่นคือบางส่วนที่นอกกรอบคิดอยู่ที่นั่น! ดีมาก.
glampert

13

บัฟเฟอร์ stencil เป็นบัฟเฟอร์จำนวนเต็มแบบไม่ลงนามซึ่งโดยปกติจะเป็น 8 บิตในปัจจุบันซึ่งคุณสามารถเติมข้อมูลต่อพิกเซลตามที่คุณต้องการโดยขึ้นอยู่กับการใช้งานต่าง ๆ (ตัวอย่างOpenGL Ops ที่นี่ ) หลังจากการทดสอบลายฉลุ

การทดสอบ stencil เป็นเพียงการดำเนินการต่อพิกเซลที่ค่า stencil ของพิกเซลปัจจุบันถูกทดสอบเทียบกับเนื้อหาของบัฟเฟอร์ stencil คุณตั้งค่าเงื่อนไขที่จะทำการทดสอบลายฉลุ (เช่น ALWAYS, LESS เป็นต้น)

คุณสามารถตัดสินใจว่าจะเกิดอะไรขึ้นกับค่าของ stencil ขึ้นอยู่กับผลลัพธ์ของการทดสอบ (ใน OpenGL โดยใช้การดำเนินการที่ฉันเชื่อมโยงคุณด้านบน)

บัฟเฟอร์ stencil มีการใช้งานค่อนข้างน้อยสิ่งแรกที่นึกถึง:

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

ในอดีตเคยมีการใช้เทคนิคการทำเงาเช่นปริมาตรเงา

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

[*] ค่าที่ต้องอ่านในกระบวนการหลังการใช้ SRV ที่ถูกต้อง!

แก้ไข: นอกจากนี้มูลค่าการกล่าวขวัญว่าใน Shader Model 5.1 (ดังนั้น D3D11.3 และ D3D12) คุณสามารถเข้าถึงค่าอ้างอิง stencil ผ่าน SV_StencilRef


6

บัฟเฟอร์ stencil ประกอบด้วยข้อมูลจำนวนเต็มต่อพิกเซลซึ่งใช้เพื่อเพิ่มการควบคุมการแสดงผลพิกเซลเพิ่มเติม

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

ที่มา: Buffer ฉลุคืออะไร? | Microsoft Developer Network

ความคิดทั่วไปคือการที่คุณสามารถตั้งค่าสำหรับแต่ละพิกเซลจากนั้นตั้งค่าการดำเนินการ ( GREATER, SMALLER, EQUALฯลฯ ) เมื่อประเมินนี้เป็น true พิกเซลจะมีการแรเงาและแสดงให้เห็นว่า

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

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