"makeContextCurrent" ทำอะไรกันแน่


12

ฉันค่อนข้างสับสนเกี่ยวกับฟังก์ชั่นนั้น การอ้างอิงบริบท GLFWกล่าวว่า:

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

แต่มันก็ไม่ได้ช่วยอะไรมาก
มันสามารถทำงานได้เหมือนglBind-วิธีการหรือไม่? (glBindBuffer, glBindVertexArray และอื่น ๆ )

คำตอบ:


21

OpenGL เป็นเครื่องของรัฐ บริบท OpenGL เก็บสถานะนั้น รัฐมีข้อมูลเช่นพื้นผิวที่ถูกผูกไว้กับหน่วยพื้นผิวซึ่งสิ่งที่แนบมา FBO ปัจจุบันมีและสิ่งเช่นนั้น

เมื่อคุณตั้งค่าบริบทปัจจุบันคุณกำลังสลับสถานะทั้งหมดจากบริบทเก่าเป็นบริบทใหม่ นี่คือตัวอย่าง:

glfwMakeContextCurrent(window1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture1);

glfwMakeContextCurrent(window2);

สิ่งนี้ทำให้บริบทของwindow1ปัจจุบัน จากนั้นจะเปิดใช้งานหน่วยพื้นผิว 2D และผูกtexture1เข้ากับมัน

ถัดไปทำให้บริบทwindow2ปัจจุบัน หากคุณต้องตรวจสอบสถานะการเปิดใช้งานของGL_TEXTURE_2Dมันจะเป็นเท็จ (เว้นแต่ว่าคุณได้เปิดใช้งานก่อนหน้านี้ในwindow2บริบท) ในทำนองเดียวกันถ้าคุณตรวจสอบซึ่งเนื้อถูกผูกไว้กับหน่วยเนื้อ 2D, คุณอาจจะพบเนื้อไม่มีการผูกพันหรือพื้นผิวอื่น ๆ กว่าtexture1ถูกผูกไว้

โดยทั่วไปการวาดทั้งหมดเกิดขึ้นในบริบทปัจจุบัน หากคุณสร้างบริบทที่แตกต่างกันปัจจุบันการวาดภาพทั้งหมดจะเกิดขึ้นในบริบทนั้น

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


1
ฉันมีคะแนนไม่เกิน 15 คะแนนดังนั้นฉันจึงไม่สามารถโหวตคำตอบที่ยอดเยี่ยมของคุณได้ ขอบคุณ !!!
เอเดรีย

1
ไม่ต้องห่วง. ดีใจที่ฉันสามารถช่วย
user1118321

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