행렬

나무늘보·2024년 1월 20일

DirectX

목록 보기
5/5

상수버퍼 constant 버퍼를 이용해서 데이터를 밀어넣어 조절하는 실습까지 했다 .

Direct X 를 이용해서 GPU에게 외주를 줘서 뭔가 그릴수있겠자는것 까지는 알겠는데

이게 렌더링이랑 뭔 상관인가 , 약간 애매하다 , 왜 이 해골이 여기 좌표에 떠있는가 ?

CraeteGeometry 부분을보면 -0.5f -0.5f 등등 설정을 해줬다 .

실제로 실행해보면 값을 넣어보면 뭔가가 바뀐다 .

엄밀하게 말하면 vertex position의 값은 -1 ~ 1 사이의 값이 들어와야 화면에 출력이된다는 말

그럼 우리가 이런 좌표를 어떻게 예상해서 만드는건가 ?

사실상 쉐이더에서 우리가 IA 단계에서 정점들을 밀어넣은 다음 , 여기에 밀어넣은 VS_output 구조체에 들어와서 , VS 영역에서

여기서 바로 input 을 바로 output으로 넘겨주는게 아니라 원래는

이 부분에서 뭔가 변화를 줘야한다

정점을 가지고 연산을 해서 그 위치를 바꾼다거나 , 회전을 시킨다거나 해서

넘겨주고 넘겨주고하면서 좌표가 결정이 되어야하는데 우리는 예상하는 최종값을

먼저 vertex에 넣어준거다 → 실전은 그렇지않다

실전에서 게임이 어떻게만들어지고 행렬이 왜 필요한지 그걸 알아봐야한다

unity unreal 다 똑같은 개념 ,

로컬 스페이스 , 이런 공간에서 모델러 , 아트 파트에서 툴로 조각을 해준다

로컬영역이라는건 모델에 대한 영역인거고 , 여기서 모델을 만들어보면 , 모델을 만든다하면 기준점이있다 . 여기서는 발로 잡혀있고 , 그거에 대한 상대좌표로 모든 삼각형들을 표시해서 물체 하나가

만들어지게된다

로컬스페이스라는건 자기만의 공간 / 우리가만든 게임세상 → 월드 공간 월드좌표

원래 처음에 생성하면 Transform에 중요한 옵션들이있다

이게 월드에서 어떻게 표현될지를 나타내는 중요한 수치라고 보면된다

Rotation , Scale , Position

사실상 우리가 어디에 어떻게 배치할지를 나타내는 수치들이라고 보면된다

게임을 만드는건 , 영화를 촬영하는것과 유사하다 , 물체를 배치하고 카메라가 물체를

촬영하는 상태라고 보면된다 . 영화촬영의 결과물이고

여기서 궁금한건 Position같은거를 건드리면 위치를 이동한다는걸 알수있는데 이 Position 같은거

이런 부분에 따라서 실제로 이 모델도 움직인다 ,

여기서 rotation scale position은 뭘 기준으로 하는것인가 ?

→ 이 게임 세상을 기준으로한 좌표 , 엄밀히 말하면 그렇진않고 계층관계가 있으면 자기 부모를 기준으로하는 상대좌표

내 상위 부모를 기준으로한 상대좌표 같은 느낌 , 어쩃든 position이라는건 월드기준으로의 나의좌표

회전같은경우는 각 회전축에 따라서 회전 , scale은 크기가 커지거나한다

→ 이게 SRT ( scale Rotation , Translation ) 엔진에 가장기본적인것

로컬 월드에 자기 혼자만의 공간에서 월드로 배치되었을때 어떤식으로 배치가 되었으면 좋겠는지

위치 회전값 스케일 3가지를 지정해서 인게임에 배치하는것이고 , 게임세상에선 Player뿐만아니라

굉장히 많은것들이 등장한다고보면됨

카메라맨이 어딘가에서 화면을 찍고있고 , UE에서는 카메라가 Component로 붙어있다

요 카메라에서찍고있는것이 실제 우리 게임화면에 나타나게된다

어떤 물체가 카메라 화면밖으로 넘어간다는건 안찍힌다는 얘기

중요한건 물체를 인게임에 배치했다고해서 끝이아니라 아직 카메라의 존재가 일단 없다고 가정을 해야한다.

우리가 3d 세상에서 물체를 배치를했다 , 결국 게임화면이 보일려면 카메라가 있어야한다

로컬에서 월드로 넘어갔고 월드에서 카메라 영역으로 변환을 해줘야하는데

결국에 우리는 카메라 영역에있는 물체만 보이기 때문이라고 생각하면된다

카메라 영역으로 바꾸면끝이 아니라 , 카메라 영역은 범위안의 모든 물체를 표현하는게 카메라의

역할 , 카메라가 바라보고있는 이 Z 라는 파란색 선 방향으로 찍고있는 범위에 따라서 좌표를 수정하는 단계가 먼저 일어나게 된다

그 그다음엔 우리가 위에서 보는것까지는 3D 화면인데 , 우리 모니터는 2D니깐 아무리 공간 3D여도

모니터에 출력이 될때는 어떻게든 2D로 만들어서 그려줘야한다

각각의 픽셀 색상을 정해주는건 PS 영역에서 정해주는것 , 이걸 최종적으로 각각 어떤 색상이 정해지는지를 고를라면 결국엔 2D로 변형하는 작업이 필요하고 이 범위 안에 있는 것들을

납작하게 만들어서 투형을 시킨다고 표현을 하는데

물체가 멀리있다→ 원근법에 따라서 작게 , 가까우면 → 크게

원근법까지 적용해서 범위안에 모든물체를 화면( 카메라 ) 에 넣는다고 보면된다

이게 바로 투영단계 → 비율에 맞게 화면에 들어오는게 목표

그 비율을 우리가 -1 ~ 1 사이의 값으로 표현을 한다 ,

그 비율이 들어오면 우리가 만든 뷰포트의 사이즈 ( 800 x 600) 으로 만들었으니 그 사이즈에

따라서 한번더 조절해서 최종적으로 우리의 윈도우 화면에 들어오게 된다고 보면된다

거의 5 단계에 걸쳐서 하는게 우리의 목표

좌표 변환은 어떻게 하는가 ?

좌표라는 정점은 우리가 vetor로 위치 벡터로 표현을 하는데 거기에 수학적으로 변환을하면

다른영역으로 우리가 로컬에서 월드 영역으로 들어가고 그다음에 카메라가 찍고있는

카메라 영역으로 들어갔다가 투영이되서 이화면안에 2D 에 납작하게 보내고

그런 일련의 작업들을 다 해야된다는 얘기

행렬을 배우면 이런 모든것들을 할수있다

결국 메시가 월드에 표현되는것은

로컬 → 월드 → 카메라 → 모니터

내가 월드 화면을 클릭하는게 아니라 화면을 클릭하는건데 ?

아까 말했던 그 5단계를 다시 역으로 돌아가야하는것 , 역으로도 가고 앞으로도가고 해야함

나를기준으로하는건지 월드기준으로 하는건지 이게 중요 , 이런 공간에 대한 이해가없으면

함수관련해서도 많이다르기때문에 힘들수있다.

profile
Unreal Programmer , C++

0개의 댓글