Quick Reference
OpenGL 기본 클립 깊이 조건은 -w ≤ z ≤ w, 나눈 뒤 NDC z는 -1~1, 기본 창 깊이는 0~1입니다. 세 공간을 같은 범위로 취급하지 않습니다.
world → view → projection → clip 좌표
→ w로 나누기 → NDC → viewport·depth range → 창 좌표카메라와 투영
view는 카메라의 위치·방향으로 세계를 카메라 기준으로 바꾸는 변환입니다. perspective는 멀수록 작게 보이는 투영, orthographic은 깊이에 따른 크기 변화를 없앤 투영입니다. GL이 카메라 객체를 별도로 만들어 주는 것은 아니며 행렬을 계산해 uniform으로 전달합니다.
GLM을 쓰는 C++ 발췌입니다. <glm/glm.hpp>, <glm/gtc/matrix_transform.hpp>를 포함하고 기본 오른손·-1~1 깊이 설정을 전제로 합니다.
glm::mat4 view = glm::lookAt(glm::vec3(0, 0, 3),
glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
glm::mat4 projection = glm::perspective(glm::radians(60.0f),
640.0f / 480.0f, 0.1f, 100.0f);시선과 up이 나란하거나 카메라 위치와 목표가 같으면 기저 구성이 퇴화할 수 있습니다. FOV 단위는 라디안으로 맞추고, 종횡비는 양수인 framebuffer 크기로 계산합니다. perspective의 near는 0보다 크고 far는 near보다 멀어야 합니다. near를 지나치게 작게 잡으면 깊이 정밀도가 악화됩니다.
직교 투영이 필요하면 같은 기본 GLM 설정에서 다음처럼 왼쪽·오른쪽·아래·위·near·far 경계를 직접 지정합니다.
glm::mat4 orthographic = glm::ortho(-2.0f, 2.0f, -1.5f, 1.5f, 0.1f, 100.0f);이 예는 가로 4·세로 3 단위의 영역을 깊이에 따른 크기 축소 없이 표시합니다. 모델·뷰와 함께 uniform으로 전달하는 방식은 perspective와 같습니다. 1.0의 glOrtho는 현재 선택한 고정 기능 행렬에 투영을 곱하지만, glm::ortho는 CPU 행렬 값을 돌려주므로 전달할 대상을 직접 정합니다.
클립과 깊이 비교
클립은 w로 나누기 전의 조건입니다. 음수·0인 w를 무조건 나눈 뒤 화면 밖 여부를 판정하는 방식과 다릅니다. 기본 depth range는 NDC 깊이를 [0,1] 창 깊이로 옮기며, 깊이 테스트의 LESS/GREATER는 이 결과를 비교합니다.
D3D·Vulkan 자료의 0~1 NDC 투영을 OpenGL 기본 환경에 가져올 때는 투영 함수의 규약을 확인합니다. 행렬 전치만 바꿔 해결되는 차이가 아닙니다. GLM의 깊이·손잡이 매크로나 명시적 변형 함수를 사용했다면 프로젝트 전체에서 같은 선택을 유지합니다.
1.0과 4.5의 차이
1.0 고정 기능은 MODELVIEW·PROJECTION 행렬 상태를 사용했습니다. Core에서는 같은 수학적 역할을 CPU 행렬·셰이더 uniform으로 표현합니다. 구형 gluPerspective는 GLU 함수이므로 OpenGL 자체 호출과 구분합니다.
4.5 또는 ARB_clip_control에서는 glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE)처럼 규약을 바꿀 수 있습니다. 기본 상태는 LOWER_LEFT·NEGATIVE_ONE_TO_ONE입니다. clip origin, depth mode, projection을 함께 맞추며 3.3 기본 경로에 무조건 호출하지 않습니다.
reverse-Z는 이와 관련된 선택이지만 단일 스위치가 아닙니다. 가까운 깊이를 크게 만드는 projection, clear 0, GREATER 계열 비교, 깊이를 읽는 후처리·그림자 경로를 함께 바꿉니다. 깊이 상태와 Graphics 투영을 연결해 판단합니다.
참고 링크
3 sources