BGRA vs RGBA 픽셀 데이터 포멧

BGRA, RGBA 포맷은 컴퓨터 그래픽스에서 픽셀 데이터를 저장하는 방식들이다.

각 알파벳은 픽셀을 구성하는 네 가지 채널을 의미하며 각각 Red, Green, Blue, Alpha의 약자이다. Red, Green, Blue는 빛의 삼원색이다. Alpha는 보통 투명값이라고 알려져있지만, 이름이 Opacity가 아니라 Alpha인 이유는 Alpha값이 투명도를 저장하기 위해 만들어진 것이 아니라 원래는 추가 정보를 저장하기 위한 값이다. 그러기 때문이 투명도 말고도 다른 데이터를 저장하는 경우도 있다. 즉 ‘+알파’를 의미하는 채널이다. 또한 Alpha 채널이 필요 없더라도 Alpha채널을 강제로 사용하도록 설계가 되어있는 경우도 있는데, 이는 메모리 정렬때문이다. 만약 삼원색만으로 데이터포맷을 만들경우 3의 배수가 되어버려, 32/64비트 아키텍쳐에서 Fetch 성능이 떨어질 수 있다. 아키텍쳐에서 한번에 읽어오는 크기에 맞추어 4의 배수의 크기로 만드는 편이 더욱 유리하기 때문에 Alpha채널이 필요없더라도 삼원색 + 알파의 묶음으로 데이터포맷이 만들어진다.

용도

  • 이미지 처리: 이미지 파일을 메모리로 불러올 때, 픽셀 데이터를 BGRA/RGBA 순서로 저장한다.
  • 그래픽스 API: DirectX같은 API에서는 픽셀 데이터를 처리하거나 텍스처를 만들 때 BGRA, RGBA 포맷을 사용할 수 있다.

차이점

  • BGRA와 RGBA는 각 알파벳 순서에 따라 데이터 정렬의 순서가 결정된다.
  • RGBA는 OpenGL에서 주로 사용되고, BGRA는 DirectX에서 기본 포맷으로 사용된다. 또한 Windows GDI에서도 BGRA가 더 흔하게 사용된다.
  • 성능: DirectX에서는 BGRA가 더 효율적으로 처리될 수 있어서 BGRA를 더 흔하게 사용된다.

성능 차이가 나는 이유는?

순서만 바꾼 것인데, BGRA와 RGBA의 성능 차이가 나는 이유가 무엇일까? 일반적으로 그래픽카드에서는 하드웨어적으로 BGRA방식이 사용된다. BGRA순서로 디스플레이에 출력하도록 설계가 되었기 때문에 BGRA는 하드웨어에서 추가적인 변환 작업없이 더 빠르게 처리될 수 있는 이유이다. 만약 하드웨어에서는 BGRA를 사용하는데 소프트웨어에서 데이터를 RGBA 형태로 제공한다면, 이 데이터 순서를 하드웨어가 BGRA로 변환해야하고, 이때 캐시 미스 문제가 발생하여 성능저하로 이루어진다.

Categories:

Updated:

Leave a comment