본문 바로가기

컴퓨터 그래픽스

컴퓨터 그래픽스 기초 - Output Merger ([KUOCW] 한정현 교수님 강의)

이 포스팅은 [KUOCW] 한정현 교수님 강의 10장 - output merger을 듣고 정리한 내용입니다.

Rendering Pipeline

이번 포스팅은 Rendering Pipeline의 마지막 단계인 output merger에 대해 포스팅합니다.

이전 단계에 무슨 연산들로 마지막 frgment shader에서 어떤 값들이 출력되는지 알았다면 이번 포스팅은 쉽게 알고 넘어가실 수 있을 거 같습니다.


 

  • Color buffer and Depth Buffer

강의에서 사용하는 툴인 OpenGL ES에서는 3가지 종류의 buffer가 있습니다. 바로 color buffer와 depth buffer 그리고 stencil buffer인데 강의에서는 위의 두 가지만 다룹니다. 먼저 Color Buffer는 pixel의 정보를 저장하는 memory space입니다. 이때 픽셀은 RGB(A) 값이라고 할 수 있겠네요. 그리고 Depth Buffer는 z-buffer라고도 부르는데 color buffer에 각 pixel에 해당하는 clip space의 z 축 값을 저장하고 있다고 보시면 됩니다. 따라서 하나의 fragment는 RGBAZ 총 5가지 채널로 나타내는 것이죠. (Color buffer와 Depth Buffer는 매칭 되는 관계이기 때문에 크기(w*h)도 같습니다.)

Clip Space


 

  • Z-buffering

Z-buffering은 Z-buffer의 정보를 이용하여 Clip Space에서 앞에있는 것과 뒤에 있는 것을 처리해주는 과정을 의미합니다. 아래와 같이 두 삼각형이 앞뒤로 배치되어있고 완전히 불투명하다면, 앞에 있는 파란 삼각형이 빨간 삼각형의 일부를 가리게 되겠죠. 이 작업을 처리해준다고 생각하시면 됩니다.

Clip Space 예시

 작업은 간단하게 이루어지는데요. 아래 그림을 보시면 처음에는 z~[0, 1]값의 최댓값인 1.0으로 초기화합니다. 다음으로 빨간 삼각형을 처리한다 가정하면, 가운데 그림처럼 해당 fragment에 z-buffer는 더 낮은 z값, 즉 더 화면의 앞에 나와있는 값으로 바꿔줍니다. 그리고 해당하는 pixel의 정보는 color buffer에 들어가죠. 그다음 파란색 삼각형이 처리되면 depth가 0.8인 빨간 삼각형은 0.5인 파란 삼각형보다 뒤에 있으므로 겹치는 부분의 z-buffer가 0.5로 처리됩니다. 그리고 color buffer에서도 이에 맞는 pixel의 값이 들어가게 되죠.

Z-buffering 그림

이와 같은 과정을 Z-buffering이라고 합니다. 이 Z-buffering은 처리되는 순서와 상관없이 일정한 결과를 가집니다. 위에서 파란 삼각형을 먼저 처리하고 빨간 삼각형을 나중에 처리하게 되더라도 z값을 비교하기 때문에 그 결과는 위와 같죠.


 

  • Alpha Blending

Pixel의 정보인 RGBA에서 A는 불투명도를 나타냅니다. A값은 0일때 완전 투명, 1일 때 완전 불투명을 나타냅니다. 위의 Z-buffering에서는 앞에 있는 물체가 뒤에 있는 물체를 가렸지만 앞에 있는 물체 반투명하다면 뒤에 있는 물체를 반영해야 할 것입니다. 이것을 처리하는 과정이 Alpha Blending이죠. 

 

Alpha Blending은 처리 순서에 영향을 끼칩니다. 따라서 제일 먼저 해야하는 일은 불투명한 Object와 투명한 Object를 구분하는 것이죠. Alpha Blending은 여러 물체의 상호작용이 아닌 배경(또는 이미 처리되어 배경이 돼버린) fragment와 지금 처리 중인 object 간의 RGBA값으로 아래 수식과 같이 계산하죠. 이때 alpha와 c_f값은 처리 중인 object가 가지고 있는 값이고 RGBAZ값입니다. c_p는 이미 처리되어 배경이 돼버린 값을 의미하죠.

Alpha Blending 수식

아래 그림과 같이 빨간색 불투명한 삼각형이 처리되어있고, 파란색 불투명한 삼각형이 처리되야 한다고 가정합시다. 그러면 겹치는 부분을 Alpha Blending 해줘야 할 것입니다. alpha 값이 0.5이고 파란색(0,0,1)과 빨간색 배경(1,0,0)을 위의 수식에 대입하면, 0.5*(0,0,1) + (1-0.5)(1,0,0) = (0.5,0,0.5)가 되는 것이죠.

Alpha Blending 그림

하지만 위의 예시는 굉장히 간단한 경우입니다. 많은 반투명한 물체가 겹쳐서 존재할 수도 있고, 물체가 어떤부분은 앞에, 어떤 부분은 뒤에 교차해서 존재할 수도 있죠. 이렇듯 Alpha Blending을 위해서는 먼저 불투명한 Object와 투명한 Object를 구분해야 합니다. 다음으로는 뒤에서부터, 즉 z값이 높은 순으로 처리가 반드시 진행되어야 하죠. 이런 처리과정이 존재한다는 것을 아시고, output merger에서 하는 역할로 알고 계시면 될 거 같습니다.


이렇게 output merger에서 하는 처리들을 알아보았습니다. 드디어 Rendering Pipeline을 다 살펴 보았습니다.

아직 가야 할 길이 먼데, 잘 포스팅 마무리했으면 좋겠네요.

 

감사합니다.

 

References

강의: [KUOCW] 한정현 교수님 강의

https://www.youtube.com/channel/UCfyXTCv0QlZxG1S1rteGI7A

강의 자료: 한정현 교수님 연구실 홈페이지
http://media.korea.ac.kr/books/