맨위로가기

Z 버퍼링

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Z 버퍼는 3차원 컴퓨터 그래픽스에서 깊이 정보를 저장하여 화면에 올바른 이미지를 렌더링하는 데 사용되는 기술이다. 컴퓨터, 노트북, 휴대폰 등에서 널리 사용되며, 하드웨어 또는 소프트웨어로 구현된다. Z 버퍼링은 1974년 Wolfgang Straßer에 의해 고안되었고, 닌텐도 64를 시작으로 비디오 게임을 포함한 3D 그래픽스에서 표준 기술로 자리 잡았다. Z 컬링, 깊이 테스트, W 버퍼링과 같은 관련 기술들이 있으며, Z-파이팅과 같은 문제점도 존재한다.

더 읽어볼만한 페이지

  • 3차원 렌더링 - 비사실적 렌더링
    비사실적 렌더링은 3D 모델이나 2D 이미지를 예술적 표현을 위해 다양한 스타일로 변환하는 컴퓨터 그래픽스 기술이며, 3D 비디오 게임, 영화 등 다양한 분야에서 활용된다.
  • 3차원 렌더링 - 볼륨 렌더링
    볼륨 렌더링은 3차원 데이터를 현실감 있는 2차원 이미지로 시각화하는 기술로, 다양한 기술들이 존재하며 의료 영상, 과학적 시각화 등 여러 분야에서 활용되고, GPU를 이용한 성능 향상이 이루어지고 있다.
Z 버퍼링
그래픽스
종류컴퓨터 그래픽스 기술
사용 분야3차원 컴퓨터 그래픽스
2차원 컴퓨터 그래픽스
기술적 세부 사항
목적가시성 결정
작동 방식각 픽셀의 깊이 값을 저장하여 가려진 표면 제거 수행
장점구현 용이성
단점메모리 사용량 증가
투명도 처리 문제
역사
최초 제안볼프강 슈트라서 (1974년)

2. 용도

Z 버퍼는 컴퓨터, 노트북, 휴대 전화 등 현대의 거의 모든 기기에서 3차원 컴퓨터 그래픽스를 구동하는 데 사용된다. Z 버퍼는 규소 칩(집적 회로)에 하드웨어로 구현되거나, 소프트웨어로 구현되어 영화의 컴퓨터 생성 특수 효과에도 사용된다.[2]

또한 Z 버퍼 정보는 빛을 기준으로 렌더링하여 섀도 매핑을 통한 그림자 생성을 가능하게 한다.[2]

3. 발전

에드윈 캣멀이 Z 버퍼를 널리 알렸지만, 1974년에 Wolfgang Straßer가 이미 이 기법을 고안했다.[3] 초기 Z 버퍼는 메모리 대역폭을 상당히 많이 사용했으나, 무손실 압축 등의 기법으로 성능이 개선되었다.[3]

Z 버퍼의 거리 정보는 정밀도가 조금만 줄어들더라도 균일하게 퍼져있지 않고 조밀한 경우 씬의 품질에 문제가 발생할 수 있다. 거리가 가까울수록 먼 값보다 더 정밀하여 가까운 물체가 더 잘 그려진다. 일반적으로 이 현상은 바람직하지만, 가끔 물체가 더 멀리 있는 것처럼 보이게 한다. 더 균일한 정밀도를 위해 고안된 Z 버퍼링의 응용은 W 버퍼링이라고 불린다.[9][10]

4. Z 컬링

Z 컬링은 깊이 정보를 기반으로 픽셀을 조기에 제거하여 가려진 면 렌더링 비용을 줄여 성능을 향상시키는 기법이다. Z 버퍼링을 수행할 때 자연스럽게 따라오는 결과로, 픽셀에 기록된 깊이와 물체의 깊이를 비교하여 물체가 가려지는지 여부를 판단한다.

Z 버퍼를 사용하면 픽셀의 깊이를 통해 그려져야 할지 아닐지를 판단할 수 있으므로 조명 계산이나 텍스처링과 같은 모든 과정을 건너뛸 수 있다. 또한, 컬링된 픽셀에 대해서는 오래 걸리는 픽셀 셰이더 계산도 건너뛸 수 있다. 따라서 Z 컬링은 필 레이트, 조명 연산, 텍스처링 혹은 픽셀 셰이더가 주된 병목일 경우 성능을 향상시킬 수 있다.

Z 버퍼링이 정렬되지 않은 모델들을 그릴 때, 화가 알고리즘을 거꾸로 사용하여 깊이의 오름차순으로 폴리곤들을 정렬하면 각 스크린 픽셀이 더 적은 횟수로 그려지도록 유도할 수 있다. 이는 필 레이트가 제한적인 씬을 많은 오버드로우를 통해 그려야 할 때 성능 향상을 가져온다. 하지만 Z 버퍼링과 함께 사용하지 않을 때 다음과 같은 여러 문제점이 있다.


  • 폴리곤의 가려짐이 서로 순환하는 현상이 발생할 수 있다. (예: A가 B를 가리고 B가 C를 가리는데 C가 A를 가린다)
  • 삼각형 간에 언제나 "가장 가까운" 지점이란 존재하지 않는다.


따라서, 화가 알고리즘을 거꾸로 사용하는 방법은 Z 컬링을 최적화하는 데만 사용될 수 있다. 예를 들어 x/y 위치와 z 깊이를 통해 폴리곤이 나뉘어 경계선이 생기고, 이로써 두 개의 폴리곤이 서로 겹칠지 아닐지에 대해서 빠르게 결정하도록 도울 수 있다.

5. 수학

렌더링될 카메라 공간의 깊이 값 범위는 종종 z\textit{near}\textit{far} 값 사이로 정의된다.

원근 변환 후, z 또는 z'의 새 값은 다음과 같이 정의된다.

:z'=

\frac{\textit{far} + \textit{near}}{\textit{far} - \textit{near}} +

\frac{1}{z} \left(\frac{-2 \cdot \textit{far} \cdot \textit{near}}{\textit{far} - \textit{near}}\right)



직교 투영 후, z 또는 z'의 새 값은 다음과 같이 정의된다.

:z'=

2 \cdot \frac{z - \textit{near}}{\textit{far}-\textit{near}} - 1



여기서 z는 카메라 공간에서의 이전 z 값이며, 때로는 w 또는 w'이라고도 한다.

결과 z' 값은 -1과 1 사이로 정규화되며, 여기서 \textit{near} 평면은 -1이고 \mathit{far} 평면은 1이다. 이 범위를 벗어나는 값은 시야 프러스텀에 없는 점에 해당하며 렌더링해서는 안 된다.

Z 버퍼는 가까운 물체에 대해 더 높은 정밀도를 제공한다.

5. 1. 고정소수점 표현

이러한 값들은 일반적으로 하드웨어 그래픽 가속기의 Z 버퍼에 고정소수점 형태로 저장된다. 먼저, 다음 공식을 통해 [0,1] 범위 내의 값으로 정규화된다.[19]

:z'=

\frac{\mathit{far}+\mathit{near}}{2 \cdot \left( \mathit{far}-\mathit{near} \right) } +

\frac{1}{z} \left(\frac{-\mathit{far} \cdot \mathit{near}}{\mathit{far}-\mathit{near}}\right) +

\frac{1}{2}



그 다음, 이 값에 S=2^d-1 (여기서 d는 Z 버퍼의 깊이로, 일반적으로 16, 24, 32 비트이다)를 곱하고 반올림하여 정수로 표현한다.[19]

:z'=f\left(z\right)=\left\lfloor \left(2^d-1\right) \cdot \left(

\frac{\mathit{far}+\mathit{near}}{2 \cdot \left( \mathit{far}-\mathit{near} \right) } +

\frac{1}{z} \left(\frac{-\mathit{far} \cdot \mathit{near}}{\mathit{far}-\mathit{near}}\right) +

\frac{1}{2} \right) \right\rfloor



이 공식을 변형하여 Z 버퍼 해상도를 계산할 수 있다. 카메라 공간에서 Z 버퍼 해상도는 Z 버퍼에 저장된 정수의 가장 작은 변화량(1 또는 -1)에 따른 증분 값이다. 해상도는 다음 공식으로 표현된다.[20]

:

\frac{z^2}{S \cdot \mathit{near}}-\frac{z^2}{S \cdot \mathit{far} }=



~

\frac{z^2}{S \cdot \mathit{near}}



이 식은 z'값이 \mathit{near} 플레인 근처에서 더 조밀하게 모여, 카메라에 가까울수록 더 정밀한 결과를 보여준다는 것을 의미한다. \mathit{near}/\mathit{far} 비율이 작을수록, 멀리 있는 물체의 정확도는 낮아진다. 따라서 near 플레인을 너무 가깝게 설정하면 가까운 물체에서 바람직하지 않은 렌더링 결과가 나타날 수 있다. near 플레인은 카메라보다 물체에 가깝게 설정하는 것이 Z 값의 정밀도를 유지하는 데 유리하다.[20]

5. 2. W 버퍼

W 버퍼는 Z 버퍼의 정밀도 문제를 개선하기 위해 고안된 기술이다. Z 버퍼는 가까운 물체에 더 높은 정밀도를 제공하지만, 멀리 있는 물체에서는 정밀도가 떨어져서 시각적 결함(아티팩트)이 발생할 수 있다. W 버퍼는 \mathit{near}\mathit{far} 사이에서 균등하게 간격을 둔 값을 사용하여 이러한 문제를 완화한다.[7]

W 버퍼는 일반적으로 부동 소수점 형식으로 값을 저장한다.[7] 카메라 공간에서 z 또는 w 값을 버퍼에 저장하며, 이 값들은 화면 공간에서 선형적으로 보간될 수 없다. 따라서 일반적으로 역수로 변환하여 보간한 후, 다시 역수로 변환하는 과정을 거친다.[7] 이렇게 하면 \textit{near}\textit{far} 사이에서 값이 균등하게 분포된다. 역수 변환을 사용하지 않는 W 버퍼 구현도 존재한다.

Z 버퍼와 W 버퍼 중 어떤 것이 더 나은 이미지를 제공하는지는 응용 프로그램에 따라 달라진다.

6. 깊이 테스트 (Z 테스트)

깊이 테스트(Depth test)는 Z 버퍼 값과 입력되는 깊이 값을 비교하는 것이다.[11] Z 테스트(Z test)라고도 한다.

깊이 테스트는 픽셀 단위로 실행된다.

깊이 테스트가 실행되는 시점(그래픽스 파이프라인상의 단계)은 여러 가지가 있을 수 있다. 픽셀 셰이더 전에 수행되는 깊이 테스트를 'Early Z test', 후에 수행되는 깊이 테스트를 'Late Z test'라고 부르기도 한다.[12]

고전적인 렌더링에서 깊이 테스트는 Late Z test로 실행된다. 이 경우 대부분 그려진 픽셀은 테스트에 의해 버려져 불필요한 픽셀 셰이더 처리가 실행된 것처럼 보이지만, 픽셀 셰이더는 깊이 값을 덮어쓸 수 있기 때문에 필요한 비용이다.[13] 특정 조건을 만족하는 경우 Early Z test를 통해 픽셀 셰이더를 건너뛰어 효율적으로 렌더링할 수 있다.

더욱 최적화를 고려하면 깊이 테스트의 실행 순서가 문제가 된다. 빈 Z 버퍼에 대해 가장 뒷부분의 Early Z test를 수행하면 버퍼가 비어있기 때문에 테스트를 통과하여 가장 뒷면인데도 그려진다. 또한 앞쪽 부분을 그린 후에 가장 앞쪽이 오면 결국 테스트를 통과하여 다시 그려지게 된다. 즉, 프래그먼트 셰이더의 실행 횟수를 최소화하려면 가장 앞쪽부터 깊이 테스트를 해야 한다. 이는 모순이며, 가장 앞쪽을 미리 알고 있다면 깊이 테스트를 하지 않고 처음부터 가장 앞쪽만 그리면 된다.

이를 해결하는 렌더링 기술이 '''depth pre-pass'''이다. Early Z test 가능 조건임을 전제로, 모든 모델의 지오메트리 패스(≒ 픽셀 셰이더 없음)를 먼저 실행하여 완전한 Z 버퍼를 완성한다. 이 작은 패스가 depth pre-pass이다.[14] 이 패스를 통해 가장 앞쪽으로 채워진 Z 버퍼를 얻을 수 있다. 이 Z 버퍼가 있다는 것은 "Early Z test를 통과하면 즉시 가장 앞쪽"이라는 상태를 의미하므로, 이 Z 버퍼를 사용한 후 각 모델의 렌더링 파이프라인을 정상적으로 작동시키면 가장 앞쪽 이외의 모든 것이 사전 폐기되는 픽셀 셰이더 최소 실행 횟수를 실현할 수 있다.[15]

7. 문제점

알파 채널을 사용하여 반투명 물체를 합성(블렌딩)하는 경우, 단순한 Z 버퍼 비교만으로는 올바른 결과를 얻을 수 없다. 블렌딩 시에는 뒤쪽에 있는 물체의 정보가 필요하지만, 앞에서부터 그리면 합성에 필요한 뒤쪽 물체 정보를 참조할 수 없기 때문이다. 또한, 뒤쪽 물체가 Z 테스트에 의해 그려지지 않을 수도 있다. 이 문제를 완화하려면 불투명한 물체를 먼저 그리고, 반투명한 물체는 Z 소트법으로 뒤쪽부터 순서대로 그리는 기법을 사용해야 한다. 다른 해결책으로는 Order-independent transparency|순서 비의존적 투명도영어 (OIT)가 있다.

근접한 여러 프리미티브(폴리곤)를 그릴 때, 뒤쪽 프리미티브의 일부 픽셀이 앞쪽 프리미티브 위에 렌더링되거나 그 반대 현상이 나타나는 Z-fighting|Z-파이팅영어이라는 아티팩트(노이즈)가 발생하여 올바른 결과를 얻지 못할 수 있다[16]。 특히 광대한 공간을 그릴 때 Z 버퍼의 정밀도가 부족하면 Z 파이팅이 발생하기 쉽다. Z 파이팅을 피하는 방법으로는 Z 버퍼 정밀도 높이기, 깊이 바이어스 적용, 스텐실 버퍼 이용[17] 등이 있다. 그러나 Z 버퍼 정밀도를 높이면 메모리 소비가 증가하고, 화면 해상도에 비례하여 Z 버퍼 필요량도 증가한다.

8. 게임 콘솔과 Z 버퍼

초대 플레이스테이션(PS1)[18], 3DO, 세가 새턴은 Z 버퍼를 탑재하지 않고 폴리곤 단위로 전후 관계를 판정하는 Z 소트법을 사용했다. Z 소트법은 Z 버퍼보다 메모리를 절약할 수 있지만, 교차하는 폴리곤을 올바르게 그릴 수 없고 소트를 위한 처리 시간이 필요하다는 단점이 있다.

반면 닌텐도 64는 Z 버퍼를 탑재했다. 이후 플레이스테이션 2, 드림캐스트 등 후속 기종에서는 Z 버퍼가 표준이 되었다.

참조

[1] 서적 Schnelle Kurven- und Flächendarstellung auf grafischen Sichtgeräten http://isgwww.cs.uni[...] 1974-04-26
[2] 서적 Real-Time Rendering, Fourth Edition https://books.google[...] CRC Press 2018-08-06
[3] Youtube How I implemented MegaTextures on real Nintendo 64 hardware https://www.youtube.[...] 2024-01-04
[4] Youtube 3D Acceleration Comparison Ep11: Mechwarrior 2 - 3DFX / PowerVR / S3 Virge / ATI Rage / Matrox Mys https://www.youtube.[...] 2024-01-04
[5] 웹사이트 Open GL / FAQ 2 - Depth Buffer Precision https://www.khronos.[...] 2017-12-26
[6] 웹사이트 Depth buffer - the gritty details http://www.codermind[...] 2008-08-03
[7] 웹사이트 Learning to Love your Z-buffer https://www.sjbaker.[...] 2018-01-03
[8] 문서 Zバッファ法 画素毎に奥行き判定を行い隠面消去 Zバッファ: 画像の奥行き情報を保存した一時領域 フレームバッファ: 画素毎に色を格納
[9] 웹사이트 W-Buffering http://www.daionet.g[...]
[10] 웹사이트 Depth Buffers (Direct3D 9) - Windows applications | Microsoft Docs https://docs.microso[...]
[11] 문서 "The depth test compares the framebuffer depth coordinate Zf with the depth value Za in the depth attachment." Khronos. ''Vulkan Guide - Using Vulkan - Depth''. Vulkan Documentation. https://docs.vulkan.[...] 2024-08-17
[12] 문서 "Early ZS testing ... it happens before any pixels are colored in by fragment shading. ... Late ZS testing happens after all the fragment shading work has been done" 以下より引用。arm. ''Depth (Z) and stencil (S) testing''. arm Developer documentation. https://developer.ar[...] 2024-08-17
[13] 문서 "For example, if a shader programmatically modifies gl_FragDepth, early ZS testing cannot be used, and late ZS testing is forced." 以下より引用。arm. ''Depth (Z) and stencil (S) testing''. arm Developer documentation. https://developer.ar[...] 2024-08-17
[14] 문서 "The depth-prepass renders the geometry without writing colors in the framebuffer." 以下より引用。arm. ''Use depth pre-pass''. Arm Developer Documentation. https://developer.ar[...] 2024-08-17
[15] 문서 "The depth-prepass ... initializes the depth buffer for each pixel with the depth of the nearest visible object. After this pre-pass the geometry is rendered as usual but using the Early-Z technique, only the objects that contribute to the final scene are actually rendered." 以下より引用。arm. ''Use depth pre-pass''. Arm Developer Documentation. https://developer.ar[...] 2024-08-17
[16] 웹사이트 Configuring depth-stencil functionality - Windows UWP applications | Microsoft Docs https://docs.microso[...]
[17] 웹사이트 Stencil buffers - Windows UWP applications | Microsoft Docs https://docs.microso[...]
[18] 뉴스 [GDC07#36]髪型・半透明・物理音源,20分セッションあれこれ - 4Gamer.net https://www.4gamer.n[...]
[19] 웹인용 Open GL / FAQ 12 - The Depth buffer http://www.opengl.or[...] 2010-11-01
[20] 웹인용 Depth buffer - the gritty details http://www.codermind[...] 2008-08-03



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com