ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터 그래픽스] Output Merger
    컴퓨터그래픽스 2024. 2. 16. 13:50

    이번 과는 내용이 아주 짧다! 짧은 만큼 빨리 정리하고 C++ 공부해야지~!

    ​

    이제까지 vertex processing, rasterization, fragment processing 에서 어떤 일이 진행되는지 포스팅 했고, 마지막 단계인 Output Merger만 남았다. 사진에서 파란색 박스는 사용자가 직접 프로그래밍 하는 것이고, 주황색 박스는 하드웨어 안에 내장된 기능이라 했는데, 출력 병합기(output merger의 한국어) 또한 하드웨어에 내장된 고정된 기능이다. 그러나 완전 고정이라기 보단, GL 함수를 이용해서 작동 방식을 일부 조절할 수 있다.

    ​

    출력 병합기가 수행하는 주된 두 가지 역할은 z-버퍼링 과 알파 블렌딩 이다.

    ​

    1. Z-Buffering

    ​

    뷰 볼륨 내에 있던 삼각형이 스크린 공간에 그려질 때 z 값은 어디로 가는가?에 대한 이야기를 이전 포스팅에서 다뤘었다. 결론부터 말하자면 우리가 눈으로 보는 스크린은 2D지만, 실제로는 각 fragment가 z 값까지 가지고 있다. 맨 오른쪽 그림에서 파란 삼각형과 빨간 삼각형이 겹쳐보일 경우 당연히 앞에 있는 파란 삼각형이 뒤에 있는 빨간 삼각형의 일부를 가리게 해야 한다. 이때 각 fragment 에 저장된 z 값의 크기로 fragment의 색상을 결정하는 것이다.

    ​

    GL은 컬러 버퍼, 깊이 버퍼, 스텐실 버퍼 총 3 가지의 버퍼를 제공하는데, 이들을 합해서 프레임 버퍼라 한다. 여기서 컬러 버퍼는 2차원 뷰포트에 나타나는 픽셀 전체를 저장하는 메모리 공간이고, 깊이 버퍼는 말 그대로 z값을 저장하는 버퍼이다 깊이 버퍼를 다른 말로 z-버퍼 라고 한다.

    Z의 범위는 0부터 1까지라고 가정했을 때, 먼저 컬러 버퍼는 배경에 해당하는 z 값인 1로 컬러 버퍼를 초기화 한다. 위의 그림같은 경우 배경색이 흰색이기 때문에 모든 fragment의 색이 흰색으로 바뀌었다.

    ​

    프래그먼트 쉐이더(사용자가 입력한 프로그램)는 한 프래그먼트의 스크린 공간 좌표를 자동으로 출력 병합기에 전달한다. 이때 출력 병합기는 기존에 있던 z값과, 실시간 파이프라인을 통해 전달된 새로운 z값을 비교한다 이는 깊이 버퍼에 저장된 값을 비교하는 것이다. 새로 전달된 z가 더 작으면 이는 더 앞에 위치한다는 뜻이므로, 컬러 버퍼의 픽셀을 새로 업데이트된 프래그먼트의 색상으로 변경하게 된다. 동시에 z-버퍼도 새로운 z값으로 업데이트 한다.

    ​

    이렇듯 z 버퍼와 컬러 버퍼를 동시에 업데이트 시키며 색상을 결정하는 알고리즘이 Z-buffering 알고리즘이다. 이 알고리즘에 따르면 새로운 프래그먼트의 색상을 반영하거나 폐기하거나 둘 중 하나의 선택을 하게 되는데, 실제로 우리가 마주하는 다양한 상황에서는 저런 이분법적인 분류만으로 모든 그래픽을 표현하는 것에 한계가 있다. 반투명한 물체가 랜더링 되는 경우가 바로 그 예시이다. 이럴 때는 알파 블렌딩을 사용한다.

    ​

    2. Alpha Blending

    원래 픽셀에 존재하던 색이 있을 때 새로운 프래그먼트가 들어왔다고 가정해보자, 만약 그 프래그먼트가 불투명하다면 그냥 z 버퍼링을 통해 색상을 대체하면 된다. 그러나 새로 들어온 프래그먼트가 반투명한 물체라면 기존에 존재하던 픽셀의 색 또한 일부 반영해야 한다.

    프래그먼트 쉐이더는 RGB 값만 출력하는 것이 아니라 여기에 투명도 (A) 가 더해진 RGBA 값을 출력한다. A 값의 비트 수는 RGB의 값과 동일하다. R 의 비트가 4비트라면, A의 비트 또한 4비트이고, 2^4 = 16 단계의 투명도를 구현할 수 있다. 보통은 범위를 0부터 1까지로 정규화 하여 사용하게 된다. 0은 완전한 투명, 1은 완전한 불투명이다.

    ​

    그림에서 파란색 삼각형의 RGBA -> (0 , 0 , 1, 0.5) || 빨간색 삼각형의 RGBA -> (1, 0, 0, 1) 이다. 알파 블랜딩은 보간의 원리와 똑같히 이루어진다. 최종적으로 (38, 56) 의 색은 빨간색과 파란색이 적절히 섞인 보라색으로 나오게 되고, RGB는 (0.5, 0, 0.5) 이다.

    ​

    여기서 중요한게 하나 있다.

    ​

    파란 삼각형은 불투명하지만 빨간 삼각형은 그렇지 않다. 랜더링 순서가 바뀌어서 파란 삼각형이 먼저 랜더링되고, 빨간 삼각형이 뒤에 랜더링 된다고 해보자. 그렇게 되면 z 버퍼링의 원리에 의해 그냥 빨간 색상 자체가 반영이 안된다.

    ​

    불투명한 삼각형들에 대해 z 버퍼링은 처리 순서와 상관 없이 올바르게 작동하지만, 반투명, 투명한 물체에 대해선 아니게 된다. 때문에 처리 순서가 중요하다. 불투명한 삼각형들을 모두 처리한 후, 반투명한 삼각형들은 뒤에서부터 앞으로 정렬해야 한다. 이 정렬 또한 실시간으로 이루어지기 때문에 계산 부하가 생긴다.

Designed by Tistory.