이번엔 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__
[컴퓨터 그래픽스] Double buffering (0) | 2020.09.13 |
---|
댓글 영역