https://www.reddit.com/r/opengl/comments/lb3ptw/what_is_context_in_opengl/
OpenGL이나 DirectX와 같은 그래픽스 라이브러리를 학습하다보면 컨텍스트(context)라는 단어를 종종 볼 수 있다. 각 그래픽스 라이브러리마다 구현된 방법도 다르고 사용 방법도 다르겠지만, 일반적으로 컨텍스트는 렌더링 파이프라인 전반에 걸쳐 사용되는 특정한 상태를 기억하고 관리하는 객체라고 생각하면 된다.
이러한 관점에서 OpenGL은 하나의 큰 상태 머신(state machine)이라고 생각하면 된다. 이 상태 머신은 하나의 스레드마다 하나의 컨텍스트를 가질 수 있으며, 컨텍스트를 이용해 상태 머신 내부에서 사용할 수 있는 모든 상태를 관리할 수 있게 된다.
컨텍스트는 기본값을 가지며, 이 값은 사용자가 원하는 방식으로 변경할 수 있다. 컨텍스트 내부에 존재하는 상태는 스레드 내부에서 전역으로 접근하여 사용할 수 있으며, 영향을 주게 된다.
여기에서 말하는 상태는 렌더링에 필요한 모든 정보(텍스처, 쉐이더, 버퍼, 리소스 등)를 포함하는 정보라고 생각하면 된다.
예를 들어 OpenGL에서 다음과 같은 함수를 호출한다고 해보자.
glBindFrameBuffer(GL_FRAMEBUFFER, 0); // 0 = default frame buffer
OpenGL에서는 화면에 렌더링할 최종 결과물을 저장하기 위해 프레임버퍼(FrameBuffer)를 사용한다. 이 함수를 이용하면 최종 결과물을 저장하기 위한 프레임버퍼를 지정할 수 있게 된다. 그렇게 되면 이 함수 호출 이후에 등장하는 모든 드로우 콜(draw call)은 새롭게 설정된 프레임버퍼를 드로우 타겟으로 삼게 된다.
여기에서 컨텍스트 내부에 프레임버퍼라는 상태가 변경되었고, 이후 호출되는 모든 드로우 콜에서는 이 변경된 상태에 영향을 받아 지정한 프레임버퍼로 렌더링 결과물을 저장하게 된다.
앞서 말한 것처럼, 컨텍스트가 가지고 있는 값들은 사용자가 변경할 수 있다. 기본 프레임버퍼가 아닌 사용자가 정의한 새로운 객체를 프레임버퍼로 사용하고 싶다면 드로우 타겟으로 사용할 수 있는 텍스처를 가지고 있는 프레임버퍼 오브젝트를 만들어 새롭게 함수를 호출해주면 된다.
정리하면 컨텍스트는 렌더링 파이프라인 전반에 걸쳐 사용되는 모든 요소들의 상태 정보를 기억하고 관리하는 객체라고 할 수 있으며, 이 정보는 스레드 내부에서 전역으로 영향을 주기 때문에 변경된 상태 정보에 따라 이어지는 함수 호출의 결과가 달라지게 된다.
'그래픽스' 카테고리의 다른 글
이미지 스트라이드(Image Stride) (1) | 2024.06.16 |
---|---|
1인칭 시점(First Person View) 구현하기 (1) | 2024.06.10 |
yaw, pitch, roll (0) | 2024.06.09 |
림(rim) 효과 (0) | 2024.06.03 |
퐁(Phong) 반사 (0) | 2024.06.01 |