💡 요약
Input Assembler
로부터 primitives input으로 받아 object space -> world space -> camera space -> clip space 로 보내 최종 output으로 모니터에 보이는 final position을 구하는 단계이다.
programmable
sections
→ 어떻게 동작할지 만들 수 있다는 것을 의미한다. 코딩이 가능하다.
shader
: program이다.
gpu는 병렬처리로 고속 floating point 연산이 가능하다.
→ floating point : gpu가 그래픽스 하기에 벡터 연산이 많아 floating point를 빠르게 처리할 수 있는 core가 많다. 반면 cpu는 int연산을 하는 unit이 많아 int연산이 빠르다.
⇒ 이로 인해 가이드 라인을 따라줘야 한다.
총 다섯개의 shader stage가 있다.
→ 그 중 VS는 뺄 수 없는 단계이다.
그림에서 연한 연두색은 빼도 상관이 없다.
초록색은 무조건 들어가야 하는 것들 이다
⇒ vertex shader is a required shader stage.
DX9부터 필요에 의해 셰이더를 하나씩 추가하기 시작했다.
GPU 파이프 라인이 한 번 돌아야 한 프레임이 표현된다.
모든 vertex마다 한번씩 돈다. ⇒ per vertex operation
특성) "내 옆에 있는 애의 정보는 참조할 수 없다!"
Transform → matrix multiplexion
Object space
(=model space)
⏬ world transform
World space
⏬ view transform
Camera space
(=eye space)
⏬ projection transform
Clip space
⇒ 이 세개의 매트릭스가 모두 합쳐지게 된다. object space에서 clip space로 한 번에 보내게 되고 이게 VS의 최종 아웃풋이 final position이 된다.
⇒ nomal은 앞으로 무조건 사용하고 nomalize 한다.
🌊 EX) Consider the triangle (p, q, r) and its normal n.
n이라는 노멀 벡터 와 (q-p) 벡터를 dot product하면 0이 된다. 수직이니까.
를 한 것은 col 벡터를 만들어주기 위함이다.
linear transform L 을 곱하면 각 정점들이 바뀌게 된다.
⇒ nomal과 관련된 식에서 성립을 하려면 L의 inverse가 나올 수 밖에 없구나!
식을 정리하면 다음과 같다. 이 나오는 이유
the camera is also an object, it is defined in the world space
Camera pose specification in the world space is as follows:
EYE
: camera position
카메라의 위치AT
: a reference point toward which the camera is aimed
카메라가 어디를 바라보고 있는가UP
: view up vector that describes where the top of the camera is pointing.
(In most cases, UP is set to the vertical axis, y-axis, of the world space.)
카메라의 윗 부분이 어디인가.
⇒ 변환하는 transform mat를 찾고자한다.
space change
- world space → camera space
⚡ view matrix
DirectX :
→ 순서에 유의하자
: 2D 모니터에 상이 맺히는 과정
View Frustum
view frustum
카메라는 무한한 공간을 보지 않는다. 관심 있는 영역 내에 있는 것만 보기 위해 관심 있는 영역만 자르게 되는데 이것을 view frustum 이라고 한다.
View Frustum은
fovy
,aspect
,n
,f
이렇게 4가지 변수가 있는데, fovy는 보는 시야각, aspect는 넓이와 높이의 비율, n은 가장 가까운 시점, f는 가장 먼 시점을 나타낸다. 이 변수들을 이용하면 아래와 같이 사다리꼴 또는 사각뿔이 잘린 거 같은 공간을 정의할 수 있다. 이 안에 있는 object만 camera가 담을 수 있다는 의미이기도 한다.
field of view
얼마나 넓게 볼 것인가
- 너무넓으면 → 퍼포먼스가 크고 왜곡이 생긴다
- 너무 좁게 → 가까이에 있는 것도 안 보인다.
⇒ 적당히 설정해야한다.
💡 View frustum culling
CPU에서 이루어지는 전처리 과정
💡 Clipping
resterization 단계에서 이루어진다.
view frustum의 boundary에 걸리면 boundary를 기준으로 잘라야한다. 잘린 부분은 잘라서 프로세스를 안할 것이다. 근데 이게 생각보다 쉽지 않다.
잘린 위치에서 vertex를 새로 생성해 primitive를 만드는 과정이 들어가야 하기 때문이다. 이와 관련된 내용은 뒷 부분에서 상세히 다루도록 하니 넘어가겠다.
⚡ Projection Matrix
해당 포스트는 강형엽 교수님의 게임그래스프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊