본문 바로가기
전공/컴퓨터 그래픽스

OpenGL 기본 틀 (5)_더블 버퍼링

by 임 낭 만 2023. 4. 9.

Dual-Port 프레임 버퍼

  • 2중 포트 구조
    • Read Port, Write Port
    • 버퍼를 읽어서 화면에 뿌리는 것은 거의 동시
    • 버퍼에 기록하는 것은 상대적으로 느림
    • 애니메이션에서 문제가 됨

Dual-Port 프레임 버퍼

2중포트 구조
  • 프레임 버퍼랑 양쪽으로 연결된 2중 포트 구조. 그래픽 프로세서가 프레임 버퍼에 물체 영상을 쓰고, 비디오 컨트롤러는 쓰인 내용을 읽어서 화면에 뿌림. 한쪽 버퍼에는 화면에 보여지는 내용을 저장하고, 다른 한쪽 버퍼는 그림을 그리는 데 사용된다는 개념
  • 이때 두 개의 속도차가 발생함. 비디오 컨트롤러가 읽는 속도 ≫ 그래픽 프로세서가 쓰는 속도
  • 이로 인해 깜빡거림 등의 문제가 발생함. 이를 해결하기 위한 것 "더블 버퍼링"
  • 애니메이션시의 문제
    • (아래 그림) 아직 새로운 내용이 완전히 기록되지 않는 도중에 비디오 컨트롤러가 프레임 버퍼를  읽어 감으로써 불완전한 프레임 (c) 내용이 출력됨


더블 버퍼링

  • 프론트 버퍼와 백 버퍼

더블 버퍼링

glutInitDisplayMode(unsigned int mode);
//기본 값은 싱글 버퍼임

glutInitDisplayMode(GLUT_DOUBLE); 

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 

void glutSwapBuffers(void);
//프런트 버퍼와 백 버퍼를 스위칭하기 위함
//이 함수가 실행되면 묵시적으로 glFlush( ) 함수가 실행
//즉, 이전의 프런트 버퍼에 가해질 명령을 모두 실행한 후에 버퍼 스위칭이 일어남
더블 버퍼링
  • 더블 버퍼링이란, 2개의 버퍼를 씀. 프론트 버퍼와 백 버퍼. 버퍼들은 각각 영상 하나를 온전히 저장할 수 있는 구조. 비디오 컨트롤러가 프런트 버퍼의 내용을 읽고 출력하는 동안 그래픽 프로세서가 백버퍼에 내용을 써감. 그래픽 프로세서가 쓰기를 마치면 비디오 컨트롤러가 백 버퍼로 스위칭 함. 그래서 현재 비디오 컨트롤러가 읽고 있는 버퍼를 프런트 버퍼로, 기록중인 버퍼를 백 버퍼로 칭함.
  • 이렇게 더블 버퍼를 쓰기 위해서 glutInitDisplayMode(GLUT_DOUBLE)이라고 초기화해야함. 그리고 glutSwapBuffers() 함수는 프런트 버퍼와 백 버퍼를 스위칭 하기 위한 것. 이 함수 실행시 묵시적으로 glFush() 실행됨. 즉 이전의 프런트 버퍼에 가해질 명령을 모두 실행한 후에 버퍼 스위칭이 일어남.

댓글