“MakeContextCurrent” tam olarak ne yapar?


12

Bu işlev hakkında oldukça kafam karıştı. GLFW Bağlam referansı şöyle diyor:

Bu işlev, belirtilen pencerenin OpenGL veya OpenGL ES içeriğini çağıran evrede güncel hale getirir. Bir bağlam aynı anda yalnızca tek bir iş parçacığında geçerli hale getirilebilir ve her iş parçacığında aynı anda yalnızca tek bir geçerli bağlam olabilir.

Ama bana pek yardımcı olmuyor. Yöntem
gibi çalışabilir glBind-mi? (glBindBuffer, glBindVertexArray vb.)

Yanıtlar:


21

OpenGL bir durum makinesidir. Bir OpenGL bağlamı bu durumu tutar. Durum, hangi dokuların hangi doku birimlerine bağlı olduğu, mevcut FBO'nun sahip olduğu ekler ve bunun gibi bilgiler içerir.

Geçerli içeriği ayarladığınızda, tüm durumu eski içerikten yeni içeriğe geçirirsiniz. İşte bir örnek:

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

glfwMakeContextCurrent(window2);

Bunun yaptığı window1akımın bağlamıdır . Daha sonra 2D doku ünitesini etkinleştirir ve texture1ona bağlanır .

Sonra window2akımın bağlamını yapar . Etkin durumunu kontrol ederseniz GL_TEXTURE_2Dyanlış olur (daha önce window2bağlamda etkinleştirmediyseniz ). Benzer şekilde, 2B doku birimine hangi dokunun bağlı olduğunu kontrol ederseniz, büyük olasılıkla herhangi bir doku bağlı olmadığını veya başka bir doku bağlı olmadığını görürsünüz texture1.

Temel olarak tüm çizim mevcut bağlamda gerçekleşir. Farklı bir bağlamı güncel yaparsanız, tüm çizim artık bu bağlamda gerçekleşir.

Çok iş parçacıklı bir OpenGL uygulamasında iş parçacığı başına tek bir bağlam olması yaygındır. Bu şekilde, her iş parçacığı kendi bağlamına girer ve diğer iş parçacıklarındaki bağlamların durumunu bozmaz.


1
15'ten fazla puanım yok, bu yüzden harika cevabınızı oylayamam. Teşekkürler!!!
Adrian

1
Telaşa gerek yok. Yardımcı olduğuma sevindim.
user1118321

Bu yorumu okudum, böylece bilgisayar grafiklerine katıldım ve bu cevabı iptal ettim.
J MADISON
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.