Z 버퍼링
Z-buffering![]() |
깊이 버퍼(depth buffer)는 컴퓨터 그래픽스에서 특정 관점에서 3D 공간에 있는 물체의 깊이 정보를 나타내기 위해 사용되는 데이터 버퍼의 한 종류입니다.깊이 버퍼는 장면을 렌더링하여 올바른 폴리곤이 다른 폴리곤을 적절히 차단할 수 있도록 하는 데 도움이 됩니다.Z 버퍼링은 1974년 볼프강 스트라서에 의해 막힌 물체를 [1]렌더링하기 위한 빠른 알고리즘에 관한 박사 논문에서 처음 설명되었습니다.겹치는 폴리곤을 결정하기 위한 유사한 해결책은 효율과 잘못된 결과를 희생하더라도 비투명 장면 요소를 처리할 수 있는 화가 알고리즘입니다.
3D렌더링 파이프라인에서는 물체가 화면에 투영될 때 투영된 화면 화상의 생성된 fragment의 깊이(z값)를 버퍼에 이미 격납되어 있는 값과 비교하여(깊이 테스트), 새로운 값이 가까워지면 치환한다.색칠된 값을 계산하는 래스터라이저와 함께 작동합니다.래스터라이저에 의해 출력되는 fragment는 다른 fragment와 중복되지 않으면 저장됩니다.
부분적으로 또는 완전히 겹치는 불투명한 물체나 표면을 포함하는 이미지를 볼 때 뷰어에서 멀리 떨어져 있고 다른 물체 뒤에 있는 물체를 완전히 볼 수 없습니다(예: 일부 표면이 다른 물체 뒤에 숨겨져 있습니다).겹치는 서페이스를 관리하는 메커니즘이 없는 경우 서페이스를 서로 위에 렌더링하고 다른 오브젝트 뒤에 배치할지 여부에 관계없이 렌더링합니다.이러한 표면을 식별하고 제거하는 것을 숨겨진 표면 문제라고 합니다.중복 여부를 확인하기 위해 컴퓨터는 첫 번째 물체에 대응하는 픽셀의 z값을 계산하여 z버퍼 내의 같은 픽셀 위치의 z값과 비교한다.계산된 z 값이 z 버퍼에 이미 있는 z 값보다 작을 경우(즉, 새 픽셀이 더 가까울 경우), z 버퍼의 현재 z 값이 계산된 값으로 대체됩니다.이 작업은 씬(scene)의 모든 개체 및 표면에 대해 반복됩니다(종종 병렬).결국 z 버퍼를 사용하면 가까운 물체는 더 멀리 숨는 등 일반적인 깊이 인식을 정확하게 재현할 수 있습니다.이것은 z컬링이라고 불립니다.
z-buffer는 이미지와 동일한 내부 데이터 구조(2d-array)를 가지며, 유일한 차이점은 3개의 값을 사용하여 색상을 생성하는 컬러 이미지 대신 각 화면 픽셀에 대해 단일 값을 저장한다는 것입니다.이로 인해 z 버퍼는 색상 정보를 저장하지 않기 때문에 흑백으로 표시됩니다.버퍼의 치수는 일관성을 위해 화면 버퍼와 동일합니다.
렌더링할 필요가 없는 특정 폴리곤을 건너뛰기 위해 보통 오브젝트의 폴리곤에 대해 프라이머리 가시성 테스트(배면 도태 등)와 세컨더리 가시성 테스트(오버랩 검사 및 화면 클리핑 등)를 수행합니다.이에 비해 Z 버퍼는 비교적 비싸기 때문에 1차 및 2차 가시성 테스트를 수행하면 Z 버퍼의 부하가 어느 정도 줄어듭니다.
z 버퍼의 입도는 장면 품질에 큰 영향을 미칩니다. 기존 16비트 z 버퍼는 두 물체가 서로 매우 가까이 있을 때 아티팩트("z-fighting" 또는 스티치링이라고 함)가 발생할 수 있습니다.보다 현대적인 24비트 또는 32비트 z 버퍼는 훨씬 더 잘 작동하지만, 추가적인 알고리즘 없이는 문제를 제거할 수 없습니다.8비트 z 버퍼는 정밀도가 너무 낮기 때문에 거의 사용되지 않습니다.
사용하다
Z 버퍼는 3D 컴퓨터 그래픽을 수행하기 위해 현대의 거의 모든 컴퓨터, 노트북 및 휴대 전화에 사용되는 기술입니다.현재는 3D 장면을 빠르고 정확하게 처리해야 하는 비디오 게임에 주로 사용됩니다.Z 버퍼는 컨슈머용 그래픽 카드 내의 하드웨어에 실장되어 있습니다.Z 버퍼는 [citation needed]또한 영화를 위한 컴퓨터 생성 특수 효과 제작에 사용됩니다(하드웨어가 아닌 소프트웨어로 구현됨).
또, 빛의 시점으로부터 표면을 렌더링 해 얻은 Z버퍼 데이터에 의해서, 그림자 매핑 기술에 [2]의한 그림자 작성이 가능하게 된다.
개발
입도가 작아도 z 버퍼의 거리 값의 정밀도가 거리에 고르게 분포되지 않으면 품질 문제가 발생할 수 있습니다.가까운 값은 멀리 있는 값보다 훨씬 정확합니다(따라서 가까운 개체를 더 잘 표시할 수 있습니다).일반적으로 이 방법은 바람직하지만 물체가 멀어질수록 아티팩트가 나타날 수 있습니다.보다 균일한 정밀도를 얻을 수 있는 z 버퍼링을 w 버퍼링이라고 합니다(아래 참조).
새로운 씬(scene)이 시작될 때 z 버퍼는 정의된 값(일반적으로 1.0)으로 삭제해야 합니다. 이 값은 깊이의 상한(0 ~ 1)이며, 이는 보기 좌절을 통해 이 지점에 개체가 없음을 의미합니다.
볼프강 스트라서는 캣멀의 발명 몇 [a]달 전인 1974년 박사학위 논문에서 이 아이디어를 기술했지만, z-버퍼 개념의 발명은 에드윈 캣멀에 의해 가장 많이 기인한다.
보다 최근의 PC 그래픽 카드(1999-2005)에서는 z 버퍼 관리는 사용 가능한 메모리 대역폭의 상당 부분을 사용합니다.z 버퍼링의 성능 비용을 줄이기 위해 다양한 방법이 사용되었습니다. 예를 들어 무손실 압축(압축/압축하는 컴퓨터 리소스가 대역폭보다 저렴함) 및 초고속 하드웨어 z-clear(서명된 번호를 사용하여 프레임 간 투명성을 모두 생략함)입니다.깊이 점검).
Z컬링
렌더링에서 z컬링은 깊이에 따라 픽셀을 조기에 제거하는 것으로, 숨겨진 표면을 렌더링할 때 성능이 향상됩니다.이는 각 픽셀 후보의 깊이를 숨겨진 기존 지오메트리의 깊이와 비교하는 z 버퍼링의 직접적인 결과입니다.
z 버퍼를 사용하면 픽셀의 깊이를 알 수 있는 즉시 픽셀을 도태(폐기)할 수 있기 때문에 보이지 않는 픽셀을 조명하거나 텍스처링하는 모든 과정을 생략할 수 있습니다.또한 시간이 많이 걸리는 픽셀 셰이더는 일반적으로 도태된 픽셀에 대해 실행되지 않습니다.따라서 z컬링은 필레이트, 조명, 텍스처링 또는 픽셀 셰이더가 주요 병목 현상인 경우에 최적화할 수 있습니다.
z 버퍼링은 지오메트리를 정렬하지 않고 깊이별로 폴리곤을 정렬하면(따라서 역화자 알고리즘을 사용하여) 각 화면 픽셀을 렌더링하는 횟수를 줄일 수 있습니다.이렇게 하면 과다 드로잉이 많은 필레이트 제한 장면에서 성능이 향상될 수 있지만, z 버퍼링과 결합하지 않으면 다음과 같은 심각한 문제가 발생합니다.
- 폴리곤은 사이클 내에서 서로 간섭할 수 있습니다(예: 삼각형 A는 B, B는 C, C는 A).
- 삼각형에는 표준적인 "가장 가까운" 점이 없습니다(예: 중심점, 가장 가까운 점 또는 가장 먼 점으로 삼각형을 정렬하든 상관없이 항상 두 개의 삼각형 A와 B를 찾을 수 있으므로 A는 "가까이"이지만 실제로는 B가 먼저 그려져야 합니다).
이와 같이 역도장의 알고리즘은 Z컬링의 최적화를 제외하고 Z컬링의 대안으로 사용할 수 없습니다(강력한 리엔지니어링이 없으면).예를 들어 최적화는 x/y 위치와 z 깊이에 따라 폴리곤을 정렬하여 경계를 제공하는 것으로, 두 폴리곤이 교호작용할 가능성이 있는지 신속하게 판단할 수 있습니다.
수학
렌더링되는 카메라 공간의 깊이 값의 범위는 z zdisplaystyle에 가까운 과\displaystyle{far 값 에서 정의됩니다.
원근법 변환 후 zz 또는 z의 새 값은 다음과 같이 정의됩니다.
맞춤법 투영 후 z z z z의 새 값은 다음과 같이 정의됩니다.
서 zz는 카메라 공간에서 zz의 값이며 w w w w로 도 합니다.
결과 z { z 값은 -1과 1 사이에서 정규화됩니다. 여기서 의 은 -1이고 f r 평면은 1입니다. 이 범위를 벗어나는 값은 보기 좌절을 나타내지 않는 점에 대응합니다.렌더링되지 않습니다.
고정 소수점 표현
일반적으로 이러한 값은 하드웨어 그래픽 가속기의 z 버퍼에 고정점 형식으로 저장됩니다.먼저 적절한 2 2 ( 1 +) {{{2}= frac 1} right)를 이전 공식에 대입하여 더 일반적인 범위인 [0, 1]로 정규화한다.
심플화:
둘째, 위의 공식에 S - ({ S을 곱하고, 여기서 d는 z-tempth(일반적으로 16, 24 또는 32비트)의 깊이이며, 결과를 [3]정수로 반올림합니다.
이 공식은 z 버퍼 분해능(앞에서 언급한 '입상성')을 계산하기 위해 반전 및 도출할 수 있습니다.의 f의 역수{ f
서 S - { S =
카메라 공간의 관점에서 z 버퍼 해상도는 z 버퍼에 저장된 정수의 최소 변화(+1 또는 -1)에 따른 증분 값입니다.따라서 이 분해능은 z { z의 함수로 z { z}의 도함수에서 계산할 수 있습니다.
z { z}를 의 f { f로 하여 카메라 공간 용어로 표현합니다.
이는 z z 이 \ 평면 와 훨씬 더 촘촘히 모여 있고 훨씬 더 멀리 떨어져 있기 때문에 카메라에 더 가까운 정밀도를 얻을 수 있음을 보여줍니다. 멀리 떨어져 있는 정밀도가 떨어집니다의가 가깝게 설정되어 있으면 멀리 있는 [4]물체에 바람직하지 않은 렌더링 아티팩트가 생기는 일반적인 원인이 됩니다.
z-buffer를 구현하려면 z { z 값이 현재 폴리곤의 정점 사이의 화면 공간에 선형으로 보간되며, 이러한 중간 값은 일반적으로 z-buffer에 고정점 형식으로 저장됩니다.
W 버퍼
w-buffer를 [5]구현하기 위해 카메라 공간의 zz의 값 w\w는으로 부동소수점 형식으로 버퍼에 저장됩니다.단, 이러한 값은 정점에서 화면 공간에 걸쳐 선형 보간할 수 없습니다.보간한 후 다시 반전시켜야 합니다.결과 w의 은 z { z가 아니라w{ }와far { { 에 균등하게 배치되어 있습니다.w-buffer의 실장은 반전을 회피하고 있습니다.
z 버퍼와 w 버퍼 중 어느 쪽이 더 좋은 이미지를 얻을지는 응용 프로그램에 따라 다릅니다.
알고리즘
다음 의사 코드는 z 버퍼링 프로세스를 보여줍니다.
// 먼저 각 픽셀의 깊이를 초기화합니다. d(i, j) = 무한 // 최대 길이 // 각 픽셀의 색상 값을 배경색 c(i, j) = 배경색으로 초기화합니다. // 각 폴리곤에 대해 (폴리곤 투영에 있는 각 픽셀) {/// (x)에서 z 폴리곤의 깊이를 찾습니다.(i, j) if (z < d(i, j)) { d(i, j) = z; c(i, j) = color; } }
「 」를 참조해 주세요.
레퍼런스
- ^ Straßer, Wolfgang (April 26, 1974). "Zukünftige Arbeiten". Schnelle Kurven- und Flächendarstellung auf grafischen Sichtgeräten [Fast curve and surface display on graphic display devices] (PDF) (in German). Berlin. 6-1.
- ^ Akenine-Mo ̈ller, Tomas; Haines, Eric; Hoffman, Naty (2018-08-06). Real-Time Rendering, Fourth Edition. CRC Press. ISBN 978-1-351-81615-1.
- ^ The OpenGL Organization. "Open GL / FAQ 2 - Depth Buffer Precision". Retrieved 2017-12-26.
- ^ Grégory Massal. "Depth buffer - the gritty details". Archived from the original on 15 October 2008. Retrieved 2008-08-03.
- ^ Steve Baker. "Learning to Love your Z-buffer". Retrieved 2018-01-03.