버퍼 : Buffer
데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역.
버퍼링(buffering)이란 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다. 다른 말로 '큐(Queue)'라고도 한다.
보통 데이터는 키보드와 같은 입력 장치로부터 받거나 프린터와 같은 출력 장치로 내보낼 때 버퍼 안에 저장된다.
그러나 버퍼는 컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용된다.
버퍼는 네트워크 상에서 자료를 주고받을 때나 스피커에 소리를 재생할 때, 또는 디스크 드라이브와 같은 하드웨어의 입출력을 결합하는 데에 자주 이용된다.
프레임 버퍼 : Frame Buffer
래스터 주사 방식에서 화면에 나타날 영상 정보를 일시적으로 저장하는 기억 장치.
그래픽 엔진에서 디스플레이에 표시할 다음 이미지를 준비할 목적으로 업데이트되는 메모리를 뜻한다.
그래픽 프로세서가 중앙 처리 장치(CPU)로부터 도형을 표현하는 디스플레이 리스트를 받아 변환하여 프레임 버퍼에 기록한다.
프레임 버퍼의 각 기억 단위는 화면의 하나의 화소에 하나씩 대응하며 화면에 그대로 반영된다.
즉, 화면의 각 점의 온오프(On/Off)나 색깔을 비트 맵으로 기억하고 있으며, 이 기억 장치에 어떤 내용을 써넣으면 그것이 화면에 표시(반영)된다.

일반적인 비디오 카드에서 프레임 버퍼는 2중 포트(연결) 구조를 가진다.
- GPU : 그려질 화면을 프레임 버퍼에 쓴다(적용시킨다).
- Video Controller : 프레임 버퍼에 그려진 화면을 출력하는 일을 한다.
여기서 생기는 문제가 있다.
모니터에 하나의 프레임 버퍼를 가지고 게임 화면을 표현한다면
- 매 프레임마다 버퍼를 지우고 그리거나
- 이미 그려진 버퍼에 덮어쓰게 될 것이다.
이 과정에서 화면에 대한 문제가 두 가지가 생기는데,
- [ 화면 깜박임(Screen Flickering) 현상 ]
프레임 버퍼에 완전히 정보가 저장되지 않은 상태에서 불완전한 내용의 버퍼를 화면에 그리면서 발생.
또는, 버퍼가 지워지는 찰나의 순간이 화면에 표시되며 화면 깜박임이 발생한다. - [ 화면 찢어짐 현상(Screen Tearing) 현상 ]
화면이 그려지는 도중 이전 화면과 현재화면이 겹쳐지면서 화면이 찢어지는 현상.
이에 대한 현상과 해결 방안에 대해서는 버퍼와 큰 연관성이 없다고 판단하여 따로 정리했다.
티어링 현상과 해결 방안에 대한 설명은 여기를 참조.
더블버퍼링 ( 프론트 버퍼 / 백 버퍼 ) : Double Buffering ( Front Buffer / Back Buffer )
※프론트 버퍼 = 전면 버퍼 / 백 버퍼 = 후면 버퍼로도 읽는다.
GPU가 프레임버퍼에 쓰는 작업은 Video Controller가 프레임 버퍼를 읽는 속도에 비해 훨씬 느리다.
그렇기 때문에, 하나의 프레임 버퍼를 사용하면 프레임 버퍼에 완전히 정보가 저장되지 않은 상태에서 불완전한 내용의 버퍼를 화면에 그리면서 화면 깜박임(Screen Flickering)이 발생하는데, 대부분의 게임 또는 실시간 3차원 그래픽은 깜박임 현상을 해결하기 위하여 더블 버퍼링을 사용한다.

작동 방식은 아래와 같다. [현재 Video Controller가 프론트 버퍼를 읽고 있다고 정의.]
- Video Controller가 Front Buffer의 내용을 출력하는 동안, GPU는 Back Buffer에 다음에 그려질 내용을 쓴다.
- GPU가 전부 내용을 썼으면 Video Controller가 Back Buffer로 스위칭한 후, 새로운 내용을 화면에 그린다.
- 그와 동시에, GPU는 Front Buffer로 스위칭하며, 새로 화면에 그릴 내용을 버퍼에 쓴다.
이를 통하여, 두 개의 버퍼를 분리하여 쓸 때는 쓰기만, 읽을 때는 읽기만 하여 완전히 준비된 영상을 사용함으로써 깜박거림을 방지한다.
그와 동시에, 더블 버퍼링은 버퍼를 두 개 사용하기 때문에, 두 배의 메모리가 필요하다.
※버퍼를 세 개 사용하는 경우도 있으며, 이는 삼중 버퍼링(Triple Buffering)이라고 부른다.
전면 버퍼와 후면 버퍼 : Front Buffer / Back Buffer
위에서는 간략하게 설명을 하기 위하여, 프론트 버퍼와 백 버퍼를 스위칭하는 방식으로 설명했다.
여기서는 설명을 위해서 아래처럼 정의를 내리고 설명을 하겠다.
우리가 최종적으로 표시되는 버퍼 : 전면 버퍼
그 화면을 보여주기 위한 렌더링을 하는 버퍼 : 후면 버퍼
후면 버퍼는 '색상 버퍼', '깊이 버퍼', '스텐실 버퍼' 이렇게 세 가지로 분류된다.
그에 비하여, 전면 버퍼는 색상 버퍼만 사용한다.
어차피 후면 버퍼에서 렌더링이 끝난 상태가 곧 색상 버퍼이기 때문이다.
깊이 버퍼와 스텐실 버퍼는 3D 렌더링을 하기 위한 보조 버퍼라고 생각하면 편하다.
우리가 실제로 모니터로 보는 건 색상 버퍼밖에 없음.
색상 버퍼 : Color Buffer
실제로 모니터에 출력할 크기만큼 픽셀(Pixel)을 갖고 있는 버퍼를 말한다.
색상 버퍼에는 렌더링된 최종 결과물이 저장되므로 그걸 그대로 모니터에 출력하면 된다.
더 자세하게 설명하면 색상 버퍼의 서페이스(Surface, 표면)에 저장된 픽셀들을 모니터에 출력하는 것이다.
서페이스는 픽셀들이 모여있는 버퍼를 뜻하는데, 픽셀들이 모여있다는 것은 렌더링 대상이 된다는 것과 동일하다.
이것을 렌더 타겟(Render Target)이라고 하는데, 렌더 타겟은 출력이 아니라, 렌더링 할 대상이라는 것을 이해해야 한다.
즉, 전면 버퍼가 아니라, 후면 버퍼가 렌더 타겟이 되는 것이다.
깊이 버퍼 : Depth Buffer
3D를 표현하는 기법 중 하나. 우리가 원하는 건 3D지만, 모니터는 2D이다. 즉, 2D를 이용해서 3D처럼 보이게 만들어야 한다는 것. 3D를 연산하여 2D로 렌더링 하게 된다.
결론은 가장 가까운 대상의 깊이 정보를 저장하는 2차원 텍스처이다.
이게 무슨 소리냐?

간단하게 설명하자면 가장 얕은(카메라와 가까운) 대상이 정해져서, 최종 Draw가 되는 것을 결정하여, 모니터에 뿌려준다는 것!
각 픽셀의 깊이값을 서로 비교해서 마치 앞뒤가 존재하는 듯한 효과를 만들어준다.
이미지의 왼쪽을 보면 도형들의 앞 뒤를 구분할 수 있는데, 이렇게 만들어 주는 것이 깊이 버퍼의 역할.
앞에 있는 효과를 보여주려면 깊이 값이 작아야 하고, 뒤에 있는 효과를 보여주려면 깊이 값이 커야 한다.
정리하자면
- 모든 객체들은 깊이를 가지고 있다.
- 카메라의 위치에서 볼 때, 겹쳐서 렌더링 된다.
- 렌더링 되는 순서는 랜덤이지만, 카메라에 가까운 깊이 값을 가지고 있는 객체가 렌더링 되고, 뒤에 있는 객체는 가려져야 한다. 이를 위하여 깊이 버퍼, 또는 스텐실 버퍼가 사용된다.
- 모든 객체가 렌더링 될 때 각 Depth 버퍼의 픽셀이 깊이 값에 저장된다.
- 기본적으로 픽셀에 깊이 값들이 중복 저장될 때, 깊이 값이 작은 것으로 '최종 저장' 된다.
깊이 버퍼는 렌더링 하고자 하는 소스 값과, 이미 렌더링 되어 있는 깊이 값(대상)과 비교하여 처리한다.
기본적으로 소스 깊이 값이 대상 깊이 값보다 작을 경우(카메라에 가까울 경우)에만 렌더링 된다.
스텐실 버퍼 : Stencil Buffer
스텐실 버퍼 또한 깊이 버퍼와 비슷하게 보이는 데, 정확히는 다르다.
깊이 버퍼가 깊이 값으로 앞뒤를 구분하는 것이었다면, 스텐실 버퍼는 렌더링에서 제외할 픽셀을 기억하는 버퍼이다.
스텐실 테스트 결과에 따라 렌더링에서 제외할 픽셀을 찾는데, 이를 활용하여 외곽선이나 그림자를 만들 때 사용한다.

흔히 거울이나, 그림자의 구현에 사용되는데, 예를 들어 벽면에 거울이 있는 경우 스텐실 버퍼를 사용하면 벽면을 제외하고, 거울이 있는 영역에 대해서만 반사되는 물체를 그려야 한다.
백버퍼의 일부 영역을 차단하여 그리지 않기 위해 사용되는 특수한 버퍼라고 생각하면 된다.
'여러 분석 > [ 단어 정의 ]' 카테고리의 다른 글
텍스처 관련 : Mip(밉), 밉맵(Mipmap)에 대하여 (0) | 2023.10.23 |
---|---|
나이퀴스트 이론 : Nyquist Frequency (0) | 2023.10.23 |
티어링 현상과 해결하기 위한 기술들 : 수직동기화, 프리싱크, 지싱크 (2) | 2023.10.23 |
KillStreak [킬스트릭] 이란? (2) | 2023.09.18 |
TTK [Time To Kill] 이란? (0) | 2023.09.18 |