Quick Syntax
// GL 3.3 Core, 선택한 FBO에 깊이 저장소가 있습니다.
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDepthMask(GL_TRUE);
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);일반적인 깊이 규약에서는 가까운 값을 남기도록 LESS와 clear 1을 함께 사용합니다. 깊이 테스트를 끄는 것과 깊이 기록만 끄는 것은 다릅니다.
상태 인벤토리
| 상태 | 기본값·범위 | 바꾸는 시점과 결과 |
|---|---|---|
| DEPTH_TEST | 비활성 | 깊이 비교가 필요한 draw에서 활성화 |
| DEPTH_FUNC | LESS | NEVER·LESS·EQUAL·LEQUAL·GREATER·NOTEQUAL·GEQUAL·ALWAYS |
| DEPTH_WRITEMASK | true | 투명 패스 등에서 false로 기록만 제한 |
| DEPTH_CLEAR_VALUE | 1, [0,1]로 제한 | 비교 규약에 맞춰 clear |
| DEPTH_RANGE | near 0, far 1 | NDC 깊이의 창 깊이 매핑 |
| 깊이 첨부 | 사용자 FBO는 별도 준비 | 없으면 비교를 켜도 기대한 가림이 생기지 않음 |
깊이 테스트가 비활성이면 depth mask가 true여도 일반 draw가 깊이를 기록하지 않습니다. 비교 없이 깊이를 쓰려면 테스트를 켜고 ALWAYS 같은 비교식을 선택하는 경로를 검토합니다. clear는 depth func를 사용하는 draw가 아니지만 기록 마스크와 scissor의 영향을 받습니다.
투명 패스와 복원
불투명 물체를 먼저 그려 깊이를 채운 뒤, 일반 알파 블렌딩 물체는 깊이 테스트를 유지하고 glDepthMask(GL_FALSE)로 깊이 기록을 막는 경우가 많습니다. 투명 물체끼리는 순서 문제도 남으므로 기록만 껐다고 해결되지 않습니다. 투명 패스 종료 뒤 true로 복원하지 않으면 다음 프레임의 깊이 clear와 draw에도 문제가 생깁니다.
EQUAL을 사용하는 깊이 선행 패스는 두 패스의 위치 계산·래스터 조건이 일치해야 합니다. 임의의 작은 부동소수 차이를 EQUAL이 허용해 주지는 않습니다. z-fighting은 깊이 비트 수뿐 아니라 projection의 near/far와 겹친 표면을 확인합니다.
셰이더 깊이와 성능
gl_FragDepth를 직접 쓰면 기본 래스터 깊이 대신 해당 값을 사용합니다. 값을 쓰는 실행 경로를 명확히 하고 early depth 처리에 미치는 영향을 고려합니다. GL이 언제나 프래그먼트 셰이더를 실행하기 전에 모든 깊이 비교를 끝낸다고 단정하지 않습니다.
버전과 Reverse-Z
기본 깊이 상태는 1.0부터입니다. 3.3 Core에서도 기본 NDC z 범위와 depth range를 구분합니다. 4.5 clip control은 0~1 NDC 경로 등을 선택할 수 있지만 이 호출만으로 reverse-Z가 완성되지는 않습니다. projection, clear 0, GREATER 계열 비교, 깊이 소비 코드의 규약을 함께 맞춥니다.
카메라와 클립 공간에서 좌표 계약을, Graphics 깊이 버퍼에서 정밀도 원리를 확인할 수 있습니다.
참고 링크
4 sources