상세 컨텐츠

본문 제목

[컴퓨터 그래픽스] Depth buffering (Z-buffering)

STUDY/__Computer Graphics

by 2_54 2020. 9. 18. 02:23

본문

이번엔 Depth buffering이다..


 

Depth buffering이란? 

 

-> 한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정하기 위해 사용하는 기법.

물체의 뒷면과 같이 보이지 않는 부분이 나타나지 않도록 할 때,

그리고 물체의 어느 부분이 보이는가를 나타낼 때 사용된다.

 

★ Z-buffer란? 

 

-> 3차원 메모리를 렌더링 할 때 보이는 점에서 다각형과 같은 물체까지의 거리(Z값)를 보관해 두는 기억 장치.

 

depth buffering 과정?

 

-> Z-buffer는 깊이 정보를 저장하여 물체의 어떤 부분이 시야에서 숨겨지지 않고 렌더링 될 지 제어한다.

버퍼는 (x-y)의 2차원 좌표를 기준으로 해당하는 각각의 스크린 픽셀 요소들로 정렬되어 있다.

 

만약 다른 물체가 같은 픽셀에 그려져야 할 때,

Z-buffering은 현재 픽셀과 새로 그려질 픽셀 중 어떤 것이 관찰자에게 더 가까운지 깊이를 비교한다.

렌더링할 때 보이는 점에서 중첩된 물체까지의 거리를 비교해서 가장 거리가 짧은 값이 Z-buffer에 보관된다.

Z-buffer에 기록되도록 새로 선택된 깊이는 이전의 깊이를 덮어쓴다.

관찰자에 가장 가까운 픽셀이 렌더링 되는 것이다.

즉, 가까운 물체가 더 먼 물체를 가리는 것

 

픽셀의 깊이는 0.0에서 1.0사이의 값으로

0.0은 View Frustum안에서 가장 가까운 물체에 해당하고 1.0은 가장 먼 물체에 해당한다.

 

View Frustum : 3D 컴퓨터 그래픽에서 모델링 된 세계에서 화면에 나타날 수 있는 공간 영역

 

★ 장면의 물체들을 먼 것에서 가까운 것 순서로 그리면 되지 않나요? 

 

-> 물체들을 정렬해야 하기 때문에 물체가 많았을 경우 오래 걸릴 수 있다.

또한 맞물린 형태의 물체들을 제대로 처리하지 못한다.

 

★ opengl에서의 사용 ★

 

-> GLFW는 위와 같은 버퍼를 자동으로 생성한다.

깊이는 각 fragment(fragment의 z 값)를 저장하고

fragment가 출력되길 원할때마다 OpenGL은 해당 깊이 값과 z-버퍼를 비교한다.

만약 현재 fragment가 다른 fragment의 뒤에 있다면 폐기하고 앞에 있다면 덮어 씌운다.

이 과정을 depth testing이라고 부르고 OpenGL에 의해 자동적으로 수행된다.

 

+ 깊이 버퍼를 루프가 돌때마다 비워주어야한다.

비워주지 않으면 이전 프레임의 깊이 정보가 그대로 버퍼에 남아있게된다.

 

fragment : Rasterizer에 의해 생성된 value들의 모음.

Rasterisation : 벡터 그래픽 이미지를 래스터 디바이스에 출력하기 위해 래스터 이미지로 변환하는 것.

 

의사코드

clear frame buffer viewport to background color
clear depth buffer zbuffer to 1.0
for each polygon P
   for each pixel (xndc, yndc) to which P projects
      if zndc < zbuffer[xndc, yndc] then
         zbuffer[xndc, yndc] := zndc
         viewport[xndc, yndc] := color of P at (xndc, yndc)
      endif
   endfor
endfor

출처 : larranaga.github.io/Blog/


힘들당

 

__END__

반응형

'STUDY > __Computer Graphics' 카테고리의 다른 글

[컴퓨터 그래픽스] Double buffering  (0) 2020.09.13

관련글 더보기

댓글 영역