[컴퓨터그래픽스] Interaction: Callbacks

Serun1017·2024년 10월 23일
0

컴퓨터그래픽스

목록 보기
17/31

Callback

Callback(콜백) 또는 Callback Function(콜백 함수)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. Callback을 넘겨받는 코드는 이 Callback을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다.

OpenGL과 같은 그래픽 라이브러리에 렌더링 루프는 일반적으로 프레임을 그리는 함수를 Callback 방식으로 처리한다. 이 함수는 프레임마다 호출되어 화면에 그래픽을 렌더링하게 된다. GLUT 또는 GLFW 같은 라이브러리에서 이러한 Callback을 설정할 수 있다.

GLUT Program with Callbacks.png

  1. Start
    • 프로그램이 실행될 때 처음 시작되는 지점
  2. Initialization
    • 프로그램의 초기화 단계.
    • 필요한 리소스 로딩, OpenGL 컨텍스트 생성, 셰이더 프로그램 커파일 등 중요한 초기화 작업을 수행
  3. Main Event Loop
    • 초기화가 완료되면 프로그램은 Main Event Loop로 들어가며, 이 루프에서 계속해서 다양한 이벤트를 처리한다.
    • 이 루프는 종료 이벤트가 발생하기 전까지 계속 반복된다.
    • glutMainLoop()
  4. END
    • 프로그램이 종료될 때 호출되는 단계
    • Main Event Loop에서 glfwwindowShoudClose() 등의 함수로 종료 조건을 확인하여 루프를 빠져나온 후, 프로그램이 정상적으로 종료되는 단계를 처리한다.

OpenGL Callback Function

  1. idle()
    • 다른 이벤트가 발생하지 않을 때 호출되는 함수
    • 주로 화면을 업데이트하거나 백그라운드 작업을 처리하는 데 사용
    • 이 함수는 CPU가 쉬지 않고 계속 실행되게 한다.
    • glutIdleFunc()
  2. Display()
    • 화면을 그리는 함수
    • 보통 장면을 렌더링하는 데 사용되며, 화면이 갱신될 때마다 호출된다.
    • glutDisplayFunc()
  3. Reshape()
    • 창의 크기가 변경될 때 호출되는 함수
    • 윈도우 크기 조정에 따른 뷰포트(viewport) 및 투영(projection)을 재설정하는 작업을 한다.
    • 예를 들어, 창 크기를 조정하면 이 함수에서 OpenGL 뷰포트를 새로 설정하여 그래픽이 올바르게 출력되도록 한다.
    • glutReshapeFunc()
  4. Motion()
    • 마우스가 움직일 때 발생하는 이벤트를 처리하는 함수
    • 이 함수는 마우스의 움직임에 따른 그래픽 상호작용을 처리할 수 있다.
    • glutMotionFunc(), glutPassiveMotionFunc()
  5. Mouse()
    • 마우스 클릭 이벤트를 처리하는 함수
    • 마우스 버튼을 눌렀거나 땠을 때 이 함수가 호출되어 클릭에 대한 반응을 처리한다.
    • glutMouseFunc()
  6. Menu()
    • 사용자가 GUI 메뉴에서 선택을 할 때 호출되는 함수
    • 메뉴에서 사용자가 선택한 항목에 따라 적절한 작업을 수행한다.
  7. Keyboard()
    • 키보드 입력을 처리하는 함수
    • 사용자가 키보드를 눌렀을 때 어떤 키가 눌렸는지에 따라 명령을 처리하거나 화면을 갱신할 수 있다.
    • glutKeyboardFunc()

실습: ColorCube

이제 이전 실습: ColorCubeidle 함수를 다시 보자.

void idle() {
	myTime += 0.333f;
	Sleep(33);

	glutPostRedisplay();
}

idle 함수에서 우린 33ms 만큼 쉬고 glutPostRedisplay 함수를 호출하였다. 그에 따라 glutPostRedisplay 함수는 display Callback 함수를 호출하였기 때문에 화면이 새로 렌더링 된다.

또한 main 함수에서 idle 함수를 Callback 함수로 등록함으로서 약 30fps로 화면을 새로 렌더링 할 수 있게 하였다.

int main(int argc, char** argv) {
	...
	glutIdleFunc(idle);
	...
}

0개의 댓글