투영 변환행렬이 3차원에 있는 점들을 2차원의 점으로 바꾸기 위한 행렬은 아니다. 2차원으로 변환하는 연산을 하기전 사전연산을 하기위한 연산이다 -> 카메라의 시야 각도를 내가 원하는 대로 설정하기 위함(60도 맞춰서 있는애들을 90도에 맞게 늘인다) 실제 투영은 90도로 일어나지만 보이는건 60도로 보이게됨.
뷰스페이스의 위치 좌표를 투영 변환 행렬이랑 곱해여한다.
변환된 행렬
x 1/tan(fov/2) , y 1/tan(fov/2) , f z / f n - f n /f n , z(투영하기전의 기존의 z를 W에 보관한다)
이를통해 2차원 투영 스페이스를 만들 수 있다.
f z / f n - f n / fn
n - 니어 z값이 어디서부터 시작되는지
f - 파 z값이 어디까지 허용되는지
이식에서 만약 z값이 니어였다? 변환된 z값은 0이 들어감
z값이 f 인걍우 변환된 z값은 f가됨
field of view (필드 오브 뷰)
이제 투영하기위해 변환된행렬을 z ( w에 저장해둔값)으로 나누자
x 1/tan(fov/2) /z , y 1/tan(fov/2) / z,( f z / f n - f n /f n ) /z , 1
여기서 세번째 인자는 z가 니어이였을때는 0/ n 즉 0이되고
f일때는 f /f = 1이된다.
즉 , 0과 1사이에서의 값으로 변환된다.
투영변환이 완려되면 가장가까운건 0 가장먼건 1이된다.
(깊이 버퍼와 비교하기 위한 값으로 변환되었음)
기존의 렌더링 파이프에서 월드 변환 행렬은 모두 다름
뷰스페이스 변환 행렬은 모두 같음
투영 변환 행렬도 모두 같은 데이터를 가지므로 매 프레임마다 한번씩 해준다.
코드로 구현해주자
레벨로고의 Tick 함수
ProgMatirx를 선언
투영변환 행렬
D3DXMatrixPerspectiveFovLH(저장할 구조체, 카메라의 높이각도(fov를 전달) 라디안값을 전달해줘야한다 D3DXToRadian,Aspect,니어,파 );
다음 그대로 장치에 투영행렬을 세팅해주자.
SetTransform을 해두로 장치가 월드변환 뷰변환 투영변환 z나누기까지 모두 수행해준다.
D3DXVec3TransfromCoord() 벡터를 행렬과 곱하기위해 1 3 44는 불가하니깐 1*4로 1을 넣어서 곱해줌
W나누기 연산을 해주지만 보통 1이므로 아무런 일도 일어나지않았던것이다.
까만색으로 나오는 이유는 dx는 기본적으로 조명을 요청하지만 조명을 넘겨주지 않아서
3d에서는 스크롤을 구현할필요가 없다 카메라가 이동하면서 기존의 스크롤연산을 그대로 수행하기 때문
이제 뷰포트로 변환해야함 (실제 유저들이 보는 게임화면으로 변환한다)
해상도가 800 * 600이라고할때
-1, 1을 0,0으로 1,-1,을 800,600으로 치환해주어야함
x 좌표에 400 + 400
y 좌표에 300 + 300해주면 한가지 식으로 두값을 모두 치환가능하다. 하지만 이는 객체가 좌우로 늘어나게 보일수밖에없다
이를 보정하는 처리를해주어야한다.
이전의 변환행렬에서 x값만 aspect로 나누어준다.
aspect는 인사이즈 x / 인사이즈 y 로 구할수있다. ( 800에 400이면 2)
원래는 정사각형인 객체가 aspect인 2로나눠져서 가로만 2배작게그려지고 윈도우 좌표계로 투영되면서 다시 가로로 2배 늘어나고 원본과 동일하게 가로로 늘어나지않고 그려질수 있게된다.
지금까지는 정점의 위치를 구하는것까지 완료하였다.
이제 진짜 네모 동그라미 세모를 그려줘야한다.
우리는 점을 찍어줬으니 점과 점 사이를 채워주는 작업을 해야한다. 이를 레스터라이즈라 한다.
레스터라이즈 : 정점에 둘러싸여진 픽셀의 정보를 생성한다.
이 픽셀 정보를 모니터에 찍어준다.결국 픽셀정보를 생성하는것을 의미
픽셀 정보는 정점 정보를 기반으로 같은 정보를 가지고있게 만든다.(최적화를 하고싶다면 정점은 정말 필요한 데이터만을가지게 만들어야한다)
정점과 정점사이에 픽셀은 정점의 정보를 선형으로 보관한다.
픽셀은 정점의 모든데이터를 선형으로 가진다.
텍스쳐는 2D (윈도우 좌표와 같음) 좌상단이 0,0 우하단이 사이즈
네모에는 정말 다양한 텍스쳐가 들어가고 이사이즈가 모두 같지는 않다.(이때 텍스쳐는 무조건 2의 N승으로 만들어야한다 DX가 강제변환해버림)
모든 텍스쳐는 비율로 생각한다 좌상단은 0,0 이고 우 하단은 1,1이다.
이렇게 비율값을 사용함으로써 사이즈에 구애를 받지않게된다.
비율로 표현한 데이터는 UV데이터라함