วัตถุประสงค์ของ glScissor คืออะไร?


32

ฉันรู้ว่ามันมีประสิทธิภาพมากกว่าการทดสอบ stencil แต่ฉันถูกสมมติว่าฟังก์ชันเดียวกันสามารถทำได้โดยใช้การแปลงภาพด้วยวิวพอร์ต

คำตอบ:


46

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

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

นั่นคือสิ่งที่กรรไกรเข้ามา glScissor () กำหนดพื้นที่หน้าจอสี่เหลี่ยมผืนผ้าเกินกว่าที่ไม่มีการวาด (หากเปิดใช้งานการทดสอบกรรไกร)

ตัวอย่างเช่นรหัสต่อไปนี้จะล้างทั้งหน้าจอแม้ว่า viewport จะถูกตั้งค่าเป็นส่วนเล็ก ๆ ของหน้าต่างขนาดใหญ่:

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

การเพิ่ม glScissor () และการเปิดใช้งานการทดสอบกรรไกร (ซึ่งถูกปิดใช้งานโดยค่าเริ่มต้น) จำกัด การล้าง

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

ในบางครั้งคุณอาจพบว่ามีการใช้งานที่ตัดโดยอัตโนมัติไปยังภูมิภาควิวพอร์ต แต่เป็นการละเมิดข้อกำหนดของ GL

นอกเหนือจากนั้นสี่เหลี่ยมผืนผ้ากรรไกรสามารถใช้เพื่อ จำกัด การวาดชั่วคราวไปยังสี่เหลี่ยมผืนผ้าย่อยของวิวพอร์ตสำหรับเอฟเฟกต์พิเศษองค์ประกอบ UI และอื่น ๆ


11
เพื่อให้ชัดเจนยิ่งขึ้นViewportคลิปการคำนวณจุดสุดยอด หากคุณวาดเส้นที่มีความหนาของเส้น> 1 หรือจุดที่มีgl_PointSize> 1 คุณจะวาดนอกวิวพอร์ตเช่นกัน
gman

13

พวกเขาทำงานที่สองส่วนที่แตกต่างกันอย่างสมบูรณ์ของไปป์ไลน์กราฟิก

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

การทดสอบ Scissor เกิดขึ้นหลังจาก shader fragment พร้อมกับการดำเนินการต่อส่วนอื่น ๆ ทั้งหมดที่เกิดขึ้นในเวลานั้นเช่น blending, depth / stencil เป็นต้นเมื่อชิ้นส่วนนั้นถูกทดสอบโดย scissor test มันจึงผ่านไปแล้ว การแปลงวิวพอร์ต

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

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


6

ฉันชอบสิ่งต่าง ๆ ที่อธิบายด้วยสายตา

ใน OnpenGL เรามีพิกัด 2D ที่เริ่มจาก -1 ถึง +1 สำหรับทั้งแกน X และ Y

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

จากนั้นภาพนี้จะต้องมีการจับคู่กับพิกัดหน้าต่าง

ลองจินตนาการว่าเรามีหน้าต่างที่มีสีเข้มเหมือนพื้นหลังและเรามีสีขาวเป็นสีใส

กรณีที่พบบ่อยที่สุดคือการมี viewport และ Scissor ครอบคลุมทั้งหน้าจอ

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

แต่เราสามารถตั้งค่าให้เป็นขอบเขตที่เล็กกว่าของหน้าจอ

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

ภูมิภาคเหล่านี้อาจแตกต่างกัน ในตัวอย่างต่อไปนี้วิวพอร์ตครอบคลุมทั้งหน้าจอในขณะที่กรรไกรคือกล่องที่เล็กกว่า

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

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

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


1
นี่คือคำอธิบายที่ชัดเจนที่สุดสำหรับฉันมันต้องการภาพวาดจริงๆ
Laurent Caillette

5

glScissors ประสบความสำเร็จในการตัดรูปทรงเรขาคณิตกับส่วนหนึ่งของหน้าจอ

ตัวอย่างเช่นคุณต้องการถ้าคุณแสดงกล่อง GUI ที่มีการเลื่อนข้อความภายใน คุณต้องการคลิปรูปทรงเรขาคณิตทั้งหมดนอกส่วนของหน้าจอที่ครอบคลุมโดย GUI แต่เก็บข้อความบางส่วนหรือรูปหลายเหลี่ยมซึ่งยังคงอยู่ภายใน

glViewport แมปพิกัดการฉายกับพิกัดของอุปกรณ์ แต่ไม่ได้คลิป

glStencil ใช้เพื่อปกปิดพิกเซลของแต่ละบุคคลในรูปแบบที่ซับซ้อนมากขึ้นเช่นรูปร่างที่ผิดปกติ ดังนั้น glScissors นั้นเร็วกว่า


1

glScissor ง่ายกว่าการแปลงภาพด้วยวิวพอร์ต

การทดสอบ glScissor ระบุว่าจะเปลี่ยนพิกเซลเมื่อเรนเดอร์ใดในขณะที่ glViewport จะเปลี่ยนวิธีการที่ gl ควรแมปจากพิกัดอุปกรณ์ไปยังพิกัดหน้าต่าง

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

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