readme.md
기록소
readme.md
전체 방문자
오늘
어제
  • 분류 전체보기
    • 네트워크
      • HTTP
      • 윈도우 소켓 프로그래밍
    • Windows API
    • 그래픽스
      • DirectX11
    • 일반
      • Linux
      • 데이터베이스
      • 팁
      • 책 후기
    • 쿠버네티스
    • 프로그래밍 언어
      • C#
      • Java
      • Go
      • C++
      • Lua
    • 책
      • 이펙티브 C++
      • 제프리 리처의 WINDOWS VIA C, C++
    • 기타

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • Delete
  • C++
  • 인터페이스
  • DirectX
  • 설계
  • wm_keyup
  • 대입연산자
  • const
  • imagestride
  • 초기화
  • 자원관리
  • consteval
  • phong
  • 상속
  • windowsAPI
  • emplace
  • Graphics
  • new
  • id3d11shaderresourceview
  • 소멸자
  • 자바8
  • 버텍스 버퍼
  • directx11
  • CPP
  • 캐스팅
  • 템플릿
  • 가상함수
  • 윈도우 소켓
  • 소켓 프로그래밍
  • 생성자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
readme.md

기록소

그래픽스

컨텍스트(Context)

2024. 9. 11. 16:07

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
    '그래픽스' 카테고리의 다른 글
    • 이미지 스트라이드(Image Stride)
    • 1인칭 시점(First Person View) 구현하기
    • yaw, pitch, roll
    • 림(rim) 효과
    readme.md
    readme.md

    티스토리툴바