buffer와 α값에 따른 blending

 

 

Buffer

 

 

버퍼는 공간 해상도( n×m )와 깊이(또는 정밀도) , 즉 픽셀당 비트 수로 정의된다.

위 그림과 같이 버퍼는 여러 층으로 이루어진 메모리 공간을 말하며, 각 픽셀에 대해 다양한 데이터를 저장한다.

 

 

 

 

  • 컬러 버퍼 (Color Buffers):
    • 화면에 표시 가능한 버퍼.
    • 앞면(front), 뒷면(back), 보조(auxiliary), 스테레오(stereo) 등의 버퍼로 나뉜다.
    • 예: 화면의 실제 색상 데이터를 저장.
  • 깊이 버퍼 (Depth Buffer 또는 Z-buffer):
    • 픽셀의 깊이(거리)를 저장.
    • 물체의 겹침을 결정하여 올바른 시각적 결과를 만듦
  • 스텐실 버퍼 (Stencil Buffer):
    • 마스크를 유지하는 역할.
    • 특정 영역에만 렌더링하거나 효과를 적용할 때 사용됨

 

 

 

 

이처럼 다양한 버퍼에서 데이터를 읽는다.

front, back, depth buffer 등 여러 버퍼가 있지만 기본적으로 back buffer를 사용한다. (double buffering 쓰는거임)

glReadBuffer 명령어를 사용하여 현재 읽을 버퍼를 변경할 수 있다.

 

 

 

 

 

 

 

 

프레임 버퍼 (Frame Buffer)는 이 메모리의 일부이며, 화면에 렌더링될 데이터가 저장된다.

그림과 같이 소스에서 데이터를 읽어오고 프레임 버퍼(목적지)에 저장한다.

 

 

 

 

 

 

 

소스(Source)의 픽셀 데이터를 목적지(Destination)로 쓰기 전에 목적지 픽셀 데이터(frame buffer)를 읽는다.

 

소스 픽셀 와 목적지 픽셀 가 결합되어 새로운 값 를 생성하여 최종적으로 목적지에 기록된다.

 

  1. 목적지의 현재 값을 읽음 (read_pixel).
  2. 소스 값과 결합하여 새 값을 계산.
  3. 계산된 값을 기록 (write_pixel).

 

 

 

 

 

 

 

소스 비트(s)와 목적지 비트(d)는 비트 단위로 결합된다.

sd의 조합을 통해 16개의 가능한 연산(기능)을 제공한다.

 

 

이 테이블에서 각각의 열은 특정 연산을 나타낸다.

 

 

 

 

 

 

 

 

이제 frame buffer에서 gl함수를 이용하여 픽셀 데이터를 읽어온다.

 

glReadPixels(x, y, width, height, format, type, myimage)

 

  • x, y: 시작 픽셀의 좌표 (프레임 버퍼 내 위치).
  • width, height: 읽어올 픽셀의 너비와 높이.
  • format: 읽어올 이미지 형식 (예: GL_RGB).
  • type: 픽셀 데이터 유형 (예: GL_UNSIGNED_BYTE).
  • myimage: 프로세서 메모리에서 데이터를 저장할 위치(포인터).

 

 

 

위와 같은 형식의 함수를 이용하여

읽어올 픽셀의 너비와 높이 해상도의 RGB 이미지를 읽어와서 myimage 배열에 저장한다.

 

 

 

GLubyte myimage[512][512][3];
glReadPixels(0, 0, 512, 512, GL_RGB, GL_UNSIGNED_BYTE, myimage);

 

프레임 버퍼 대신 프레임 버퍼 오브젝트(FBO)를 사용하여 텍스처 메모리에 렌더링할 수 있다.

이후 텍스쳐로 렌더링하여 텍스쳐 메모리에서 데이터를 읽을 수 있다.

 

 

 

 

 

 

 

 

 

Blending

 

buffer에서 이미지 데이터를 읽고(pixel들을), 최종적으로 반투명 표면과 이미지 합성을 위한 기술이다.

 

여러 레이어를 결합하여 최종 이미지를 생성하거나,

반투명 및 투명한 오브젝트 렌더링에 유용하다.

 

 

 

 

 

여기에서 s와 d는 각각 소스와 목적지의 블렌딩 팩터이고

b와 c는 소스와 목적지의 색상이다.

 

이를 각각 곱하고 더하여 최종적인 블렌딩 color를 buffer에 저장한다.

 

 

 

 

 

 

블렌딩의 결과는 순서에 따라 달라지기 때문에 소스와 목적지에 어떤 것을 할당할지 관리해야 한다.

이 계산에서 교환법칙은 성립하지 않기 때문에 블렌딩 시 렌더링 순서를 고려해야 한다.

 

 

 

 

 

 

 

 

모델을 배경과 합성할 때에는 

전경(Foreground)과 배경(Background)을 별도로 관리한다.

 

 

 

 

 

 

우선, 픽셀 당 1비트를 저장하여 해당 픽셀이 전경에 속하는지 확인할 수 있다.

하지만 이와 같은 경우는 point sampling된 rasterization같이 aliasing 현상이 일어난다.

 

 

경계 근처의 픽셀은 전경(Foreground) 또는 배경(Background)에 정확히 어느 한 곳에 속하지 않기 때문이다.

 

 

 

 

 

 

이와 같은 문제를 해결하기위해서

경계 픽셀을 전경과 배경 색상 간에 보간(Interpolate)한다.

 

 

픽셀 값이 0(배경)에서 1(전경)로 변경되며, 이 중간값은 두 영역을 혼합한 결과를 나타낸다.

 

 

 

 

 

 

이는 픽셀이 얼마나 커버되었는지를 나타내는 값으로

픽셀의 불투명도를 나타낸다. (α)

 

이렇게 α 값 까지 고려하여, 결합된 픽셀의 최종 색상을 결정한다.

 

 

 

 

 

알파 값이 적용된 픽셀에서 부드러운 혼합 효과를 확인할 수 있다.