색상버퍼(ColorBuffer),색상깊이(ColorDepth),RGBA

2023. 6. 25. 12:48Public/Graphics

색상은 색상을 혼합해서 각 픽셀에 대한 특정 색상을 생성한다.

색깔 혼합에 대한 일반적인 방법은 빨강,녹색,파랑 (RGB)이 3가지 색상을 함께 섞는 것이다.

이 RGB 색깔의 다양한 세기가 결합해 색상의 범위가 결정된다. 현대의 수많은 디스플레이가 RGB외의 다양한 색상 포맷을 지원하지만, 대부분의 비디오 게임은 RGB로 최종 색상을 산출한다. RGB값이 모니터 디스플레이에서 다른 색상 포맷으로 변경되는지 또한 그렇지 않은지는 게임 프로그래머가 다룰 수 있는 영역 밖에 있다.

 

그런데 여러 게임은 내부적으로 게임 그래픽 계산을 위해 다양한 색상 표현을 사용한다. 예를 들어 수많은 게임은 내부적으로 투명도를 지원하기 위해 알파(Alpha)값을 사용한다. 약어인 RGBA는 RGB색상에 알파값을 추가해서 참조한다. 알파 요소를 더하면 게임 내의 대화창 같은 특정 오브젝트의 투명 처리가 가능하다. 하지만 투명성을 지원하는 디스플레이가 거의 없으므로 게임은 궁극적으로 최종 RGB 색상을 계산하고 그 자체로 투명한 느낌을 자각할 수 있도록 해야한다.

 

 

 

색상 깊이

디스플레이에서 색심도(色深度, Color Depth)란 디스플레이가 표현할 수 있는 색의 가짓수를 의미합니다. 일반적으로 디스플레이는 R, G, B 색을 내는 서브픽셀(Sub-pixel)의 조합을 통해 색을 내는데 R, G, B의 배합과 R, G, B 각각의 밝고 어두운 정도(계조)를 조절해 다양한 색상을 표현할 수 있습니다. 색심도가 높을수록 더욱 풍부한 색 표현이 가능합니다.

 

 

 

색상버퍼

RGB 이미지를 보여주기 위해 디스플레이는 각 픽셀의 색상을 알아야한다. 컴퓨터 그래픽스에서 색상 버퍼(Color buffer)는 전체 화면 색상 정보를 포함하고 있는 메모리상의 위치를 뜻한다. 디스플레이는 콘텐츠를 화면에 그리기 위해 색상 버퍼를 사용한다. 각(x,y) 인덱스가 화면상의 픽셀과 일치하는 2차원 배열로서 색상 버퍼를 생각해보자. 게임 루프의 '출력 생성' 단계 동안 매 프레임에서 게임은 그래픽 출력을 색상 버퍼에 쓴다.

색상 버퍼의 메모리 사용률은 각 픽셀이 사용한 비트의 수에 의존한다. 예를 들어 일반적인 24비트 색상 깊이(Color Depth)에서 빨강,녹색,파랑은 각각 8비트를 사용한다. 이는 2^24 또는 16,777,216개의 독특한 색깔을 표현할 수 있다는 것을 뜻한다. 게임이 또한 8비트 알파값을 저장하길 원한다면 색상 버퍼에서 각 픽셀은 32비트의 크기를 가지게 된다. 픽셀당 32비트 크기를 가진 1080p(1920X1080) 해상도에 대한 색상 버퍼는 1920x1080x4바이트를 사용하며, 이 크기는 약 7.9MB이다.

 

[노트]

여러 게임 프로그래머는 프레임을 위한 색상 데이터를 포함하는 메모리 위치를 표현하기 위해 용어 프레임 버퍼(frame Buffer)를 사용하기도 한다. 그러나 프레임 버퍼의 가장 정확한 정의는 색상 버퍼와 기타 버퍼(깊이 버퍼와 스텐실 버퍼 같은)의 조합이다. 그래서 명확성을 위해 이 책에서는 프레임 버퍼는 사용하지 않고 구체적으로 지정된 버퍼 이름을 사용한다.

 

일부 최신 게임은 RGB 요소를 16비트 크기로 사용하는데 16비트 크기는 색상 수를 증가시킨다. 또한 RGB요소의 크기가 16비트가 되면 색상 버퍼의 메모리 사용도 두배로 증가시킨다. 1080p의 경우에는 대략 16MB로 증가한다.  얼핏보면 최근의 비디오 카드는 이용할 수 있는 비디오 메모리의 크기가 몇 기가바이트인 걸 생각하면 적은 양이라고 생각할 수 있다. 하지만 최신 게임의 모든 메모리 사용률을 고려한다면 8MB는 이곳저곳에서 빠르게 증가될 수 있다. 대부분의 디스플레이는 이 글을 쓰는 시점에서는 아직 16비트 색상 요소를 지원하지 않지만, 점차적으로 일부 제조사에서 8비트 이상의 색상 버퍼를 지원하는 디스플레이를 제공하기 시작했다.

8비트 색상이 주어졌을 때 이 값을 참조하는 방법에는 2가지가 있다. 한 가지 접근법은 각 색상(채널)의 비트 수와 일치하는 부호 없는 정수를 사용하는 것이다. 채널당 8비트 색상 깊이에서 각 채널은 0에서 255의 값을 갖고 있다. 다른 한 가지 접근법은 십진수 값을 0.0에서 1.0 범위의 값을 가지도록 정규화하는 것이다.

 

정규화된 범위를 사용해서 얻을 수 있는 한 가지 장점은 색상 깊이에 상관없이 대략적으로 같은 색상을 산출한다는 데 있다. 예를 들어 정규화된 RGB 값(1.0,0.0,0.0)은 빨강의 최댓값이 255(색상당 8비트)이거나 65,355(색상당 16비트)이든 상관없이 순수한 빨강색을 산출한다. 그러나 부호 없는 정수 RGB 값(255,0,0)은 색상당 8비트인 경우에만 순수한 빨강을 산출한다. 색상당 16비트인 경우 (255,0,0)은 거의 검은색과 마찬가지다.

 

이 두 표현 사이의 변환은 간단하다. 부호 없는 정숫값이 주어졌을 때 정규화된 값을 얻기 위해 부호 없는 정수가 표현할 수 있는 최대값으로 나눈다. 역으로 정규화된 값이 주어졌을 때는 그 값에 부호 없는 정수가 표현할 수 있는 최댓값을 곱한다. SDL라이브러리는 부호 없는 정수를 사용하므로 지금부터는 이 표현을 사용한다.

 

 

 

 

 

'Public > Graphics' 카테고리의 다른 글

[Node]Platonic Solides  (0) 2023.09.01
더블 버퍼링,수직동기화  (0) 2023.06.25
레스터 그래픽스 - raster graphics (벡터,래스터)  (0) 2023.06.25
Z Buffer  (0) 2022.07.25
레스터라이저  (0) 2022.07.10