“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컨텍스트 에서 활성화하지 않은 경우) false 입니다. 마찬가지로 어떤 텍스처가 2D 텍스처 단위에 바인딩되어 있는지 확인하면 바인딩 된 텍스처가 없거나 바인딩되지 않은 텍스처가있을 수 texture1있습니다.

기본적으로 모든 드로잉은 현재 컨텍스트에서 발생합니다. 다른 컨텍스트를 현재로 만들면 이제 모든 컨텍스트에서 해당 그리기가 수행됩니다.

다중 스레드 OpenGL 응용 프로그램에서 스레드 당 단일 컨텍스트를 갖는 것이 일반적입니다. 그렇게하면 각 스레드가 자체 컨텍스트로 그려지고 다른 스레드의 컨텍스트 상태를 엉망으로 만들지 않습니다.


1
점수가 15 점을 넘지 않아 멋진 답변에 투표 할 수 없습니다. 감사!!!
Adrian

1
걱정 마. 기꺼이 도와 드리겠습니다.
user1118321

나는이 의견을 읽었으므로 컴퓨터 그래픽에 합류 하여이 답변을 찬성했습니다.
J MADISON
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.