[한정현 컴퓨터 그래픽스] 10장 출력 병합

이한결·2025년 2월 12일
0

[KUOCW]Computer Graphics

목록 보기
9/16

출처: https://www.youtube.com/watch?v=CAfdIW8M6HA&list=PLYEC1V9tJOl03WLDoUEKbiYW_Xt4W6LTl&index=6
한정현님의 컴퓨터그래픽스 10장 강의를 기반으로 제작한 블로그입니다.

많이 보신 그림인 gpu pipeline을 다시 한번 보도록 하겠습니다. 8장 texturing과 9장의 lighting까지 공부함으로서 우리는 fragment shader까지 공부했습니다. 이제 output merger 하나의 단계만 남았고 해당 과정을 10장에서 공부하도록 하겠습니다.

Buffers

Output merger는 3가지 buffer로 구성되어 있습니다.

color buffer: 화면에 보여질 픽셀들을 저장하는 버퍼

Depth buffer(z-buffer): color buffer와 같은 해상도를 갖고, z 값을 저장

Stencil buffer: 생략

z-buffering

Fragment shader에서 interpolation을 진행할 때 지금까지 (x,y)좌표에 대해서만 알아봤지만, 실제로는 z좌표에 대해서도 진행이 됩니다. Z-buffer에 대해서 interpolation을 진행하면서 실제로 screen space에서 어떤 물체를 보게 되는지 정의할 수 있게 됩니다.

z가 큰순으로 진행

초기 z-buffer는 maxZ가 1.0이기 때문에 모든 값을 1.0으로, color buffer는 background 흰색으로 설정합니다.

z-buffer 업데이트: z값을 비교해서 더 작으면 삽입 아니면 아무 일도 안 일어납니다.

color buffer 업데이트: z값이 바뀌면 같이 해당 색깔이 들어갑니다.

가장 큰 z 값을 갖는 빨간색에 대해서 z값과 color를 업데이트 합니다. 0.8로 update된 부분을 빨간색으로 채웁니다.

이후에 다음 큰 z값을 갖는 파란색에 대해서 z값과 해당 부분의 color를 업데이트합니다.

z가 작은순으로 진행

초기세팅 z가 1.0과 흰색은 동일합니다. 이후에 z값이 작은 순으로 진행한다면 z값 0.5와 파란색이 채워질 것이고, 이후에 0.8 빨간색이 채워집니다. 이때 주의해야할 점은 z값이 작아야 삽입되는데 0.8이 0.5보다 크기때문에 3군데가 z값이 변하지 않아서 결론적으로 빨간색으로 변하지 않습니다.

결론적으로 z-buffering은 순서와 상관없이 동일한 결과를 야기합니다.

Alpha blending

Alpha: 물체의 불투명도를 나타내는 값으로 1은 불투명, 0은 투명한 값을 나타냅니다.

위의 그림처럼 알파가 작아질 수록 흐릿해져서 뒤에 있는 물체가 보이게 됩니다.

Alpha blending은 간단합니다. c=αcf+(1α)cpc = {\alpha}c_f + (1-{\alpha})c_p를 이용해서 색깔을 계산합니다. cfc_f는 alpha 값에 해당하는 rgb색상, cpc_p는 비교당하는 점의 색깔이라고 보시면 됩니다.

예시를 들어드리면 현재 파란색 값에 대해서 z-bffer를 업데이트하면서 색깔도 업데이트하려고하는데, 이전 처럼 단순히 z값을 비교해서 색깔을 완전히 변화시키는게 아니라 alpha 값을 이용해서 이전값과 현재 값을 모두 영향을 주도록 합니다. 그래서 파란색의 alpha가 0.5이고, rgb 값이 (0,0,1), 빨간색의 rgb는 (1,0,0)이기 때문에 c = (0.5,0,0.5) 값을 갖게 됩니다.

Alpha blending도 순서와 상관없이 동일한 결과가 나타날까요? 정답은 아닙니다. 만약에 파란색을 먼저 그리고 빨간색을 그린다면 z값이 빨간색이 0.8로 더 작아서 업데이트 되지않고 파란색 값만을 갖게 됩니다.

따라서 Alpha blending을 할 때는 지켜야할 2가지 순서가 있습니다.

  1. Alpha 값이 1인 부분을 먼저 실행
  2. Alpha 값이 1이 아닌 부분은 뒤에서 앞으로 진행

실제 사용 사례

profile
열정으로 가득할 페이지

0개의 댓글