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

Serun1017·2024년 10월 23일
0

컴퓨터그래픽스

목록 보기
18/31

실습: ColorCube 에서 출력된 결과를 보았을 때 육면체가 제대로 표현되지 않는 것을 알 수 있다. 이는 부정확한 depth 표현으로 인해 발생한 문제로 이를 해결하기 위한 방법이 Z-Buffer(Depth-Buffer) 이다.

Z-Buffer (Depth-Buffer)

Z-Buffer (Depth-Buffer)는 3D 컴퓨터 그래픽스에서 사용되는 기술로, 장면의 깊이 정보를 저장하여 올바른 픽셀의 렌더링 순서를 결정하는데 도움을 준다.

원리

  1. depth 정보 저장
    각 픽셀에 대해 화면의 깊이 정보를 저장하는 버퍼를 사용한다. 이 깊이 값은 카메라와 객체 간의 거리를 나타낸다.
  2. 렌더링 과정
    화면의 각 픽셀에 대해 렌더링할 객체의 깊이 값을 계산한다. 각 픽셀에 대한 깊이 값이 Z-buffer에 저장된 값보다 작으면(즉, 카메라에 더 가까운 경우) 해당 픽셀의 색상과 깊이 값을 업데이트 한다. 그렇지 않으면 해당 픽셀의 값은 변경되지 않는다.
  3. 결과
    모든 객체가 렌더링 된 후 Z-buffer를 사용하여 최종 화면을 표시한다. 이 과정 덕분에 화면에 그려지는 객체의 가시성이 올바르게 유지된다.

Z-Buffer.png

장점

  1. 간단한 구조
    복잡한 가시성 알고리즘을 사용하지 않고도 깊이 값을 비교하여 가시성을 처리할 수 있다.
  2. 다양한 장면 처리
    다양한 형태의 객체와 씬을 쉽게 렌더링할 수 있다.

단점

  1. 메모리 사용량
    Z-buffer는 각 픽셀에 대해 깊이 값을 저장해야 하므로, 고해상도 이미지에서는 상당한 메모리를 필요로 한다.
  2. 정확도 문제
    깊이 값의 표현 범위가 제한적이기 때문에, 원근감이 강한 장면에서는 깊이 값을 정확히 표현하지 못할 수 있다. 이로 인해 Z-fighting 문제가 발생할 수 있다.

Z-fighting

Z-fighting은 두 개의 객체가 거의 같은 깊이 값을 가질 때, 어떤 객체가 화면에 렌더링될지를 결정하기 어려워지는 현상이다.

Z-fighting.png

실습: ColorCube에 Z-Buffer 적용

이제 Z-Buffer를 ColorCube에 적용해보자.

OpenGL에서 Z-Buffer를 적용하는 방법은 매우 쉽다. 아래 코드를 추가해보자.

int main(int argc, char** argv) {
	...
	// GLUT_DEPTH 추가
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
	...
}
void display() {
	// GL_DEPTH_BUFFER_BIT 추가
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// GL_DEPTH_TEST 활성화
	glEnable(GL_DEPTH_TEST);
	...
}

결과

정상적으로 육면체가 출력 되는 것을 볼 수 있다.

ColorCube_Z-buffer_result.png

0개의 댓글