일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- swapchain
- 다이렉트X
- GPU
- C언어
- 다이렉트 초기화
- Input Assembler
- 전처리문
- c
- CPU
- UE4
- DirectXTK
- DirectX12
- 코딩
- C++
- Direct Init
- CommandList
- 다중표본화
- 게임수학
- 프로그래밍
- engine
- 다이렉트X 튜토리얼
- View
- Direct3D
- DESC
- 동기화
- vertex
- DirectX
- RenderTargetView
- Direct3D Init
- 세팅
- Today
- Total
비타Cpp
렌더링 파이프 라인 - VS(Vertex Shader) Stage - 투영과 동차 절단 공간 본문
카메라의 요소에는 위치와 방향만 있는 것이 아니다. 바로 카메라에 보이는 공간, 바로 절 두체(Frustum; 각뿔대, 끝이 잘린 사각뿔)에 대해 정의해야 한다.
3차원 장면을 2차원의 이미지로 표현하려면, 절두체 안에 있는 3차원 기하구조를 2차원 투영 창으로 투영해야 한다. 이때 3차원의 요소를 2차원의 투영 이미지에서 표현하는 방법 중 하나는 바로 "원근감"이다.
원근감을 나타내기 위해서는 투영을 하나의 소실점을 만들어서 절두체 모양으로 해야 하는데, 이때의 투영을 원근 투영(Perspective Projection)이다. 원근 투영은 아래 그림처럼 표현된다.

3차원 기하구조의 한 정점에서 시점(Eye Point)으로의 직선을 정점의 투영선(line of projection)이라고 한다. 원근 투영 변환은 아래 그림처럼 하나의 3차원 정점 v를 그 투영선이 2차원 투영 평면과 만나는 점 v'으로 변환하는 변환이다.

이젠 절두체를 정의해본다. View 공간에서 투영의 중심을 원점에 두고 양의 z축을 바라보는 시야 절두체를 네 가지 수를 이용해서 정의할 수 있다. 여기서 사용되는 네 가지 수량은 원점과 가까운 평면 사이의 거리 n, 먼 평면 사이의 거리 f, 수직 시야각 α, 종횡비 r이다. 이는 아래 그림으로 알기 쉽게 표현했다.

r의 정의는 투영 창의 넓이 / 투영 차의 높이 (w/h)로 정의된다. 예를 들어, 후면 버퍼가 1920 x 1080이면 r = 1920/1080 ≈ 1.777로 설정한다.
편의상 종횡비가 w:h을 가진다고 가정했을 때, r = w/h -> w = hr이 된다.
수직 시야각이 α가 되는 투영 창 거리 d는 아래와 같이 구해진다.
tan(α2)=h/2d⇒ d=cot(α2)h/2
그다음은 수평 시야각 β를 구하는 식이다.
tan(β2)=rd=rcot(α2)h/2=r ⋅ tan(α2)h/2
β=2tan−1(r⋅tan(α2)h/2)

위의 그림을 보면, 투영 창의 높이가 2일 때, 점(x, y, z)을 z = d 평면에 투영한 점(x', y', d)을 구하고자 한다. 좌표 성분 x와 y를 따로 고찰하고 닮은꼴 삼각형의 원리를 적용하면,
x′d=xz⇒ x′=xdz=xcot(α/2)z=xztan(α/2)
이고,
y′d=yz⇒ y′=ydz=ycot(α/2)z=yztan(α/2)
임을 알 수 있다. 이때 점(x, y, z)가 절두체 안에 있을 필요충분조건은 다음과 같다.
−r≤x′≤r−1≤y′≤1n≤z≤f
'DirectX12 > 메모' 카테고리의 다른 글
CPU와 GPU의 상호작용 - Command Queue, Comand List (0) | 2021.09.27 |
---|---|
렌더링 파이프 라인 - Tessellation Stage(테셀레이션 단계) (0) | 2021.08.06 |
렌더링 파이프 라인 - VS(Vertex Shader) Stage - View Space (0) | 2021.08.05 |
렌더링 파이프 라인 - VS(Vertex Shader) Stage - World Space & Local Space (0) | 2021.08.01 |
렌더링 파이프 라인 - IA(Input Assembler) Stage - Index (0) | 2021.08.01 |