[1]. Transform.h 에 각각, 실시간 회전과 고정 회전을 담당하는 함수 2개를 선언한다.

[2]. Turn 함수는, 실시간 회전을 담당하는 함수이고, Transform의 vRight, vLook, vUp 의 방향 벡터 3가지를 가져온 후, 여기에 따로 추가한 회전 담당 행렬을 곱연산 해주는 방식이다.

[3]. _vAxis 축을 기준으로 해서, RotationPerSec * fTimeDelta 만큼의 벡터 값을 반환해서 행렬에 넣어주고,

[4]. Set_State 함수로, 상태 행렬에 최종적으로, 각각의 방향 벡터 3가지에 행렬을 인자로 넣어, XMVector3TransformNormal 함수를 통해, 정보를 저장한다.

[5]. Normal 과 Coord 의 차이를 다시 한 번 되집어 보자. Coord 는 w로 나눈다라는, 연산을 수행.

image.png

[6]. Rotation 함수는 실시간 회전 이었던, Turn 함수와 달리, 고정된 회전을 담당하고, 항상 고정되어 있기 때문에, 항등행렬을 기반으로 해서 함수를 구현한다.

[7]. XMVector3 함수를 통해 각각의 방향벡터 3개에서 정보를 가져와서, vAxis 축으로 내가 지정한 각도 만큼, fRadians 회전한 행렬을 마찬가지로 XMVector3TransformNormal 함수에 넘겨서 Set_State한다.

[8]. LookAt 함수 때 처럼, Scale 관련 문제가 있으므로, Comput_Scale 함수를 통해 반환된 원래의 Scale 값을 XMVectorSet 할 때, 항등 행렬에다가 곱해주는걸 주의한다.

image.png

[9]. 이제 기껏 지금까지 Transform 클래스에 함수 기능을 추가하면서, 눈으로 확인해 볼 객체의 움직임이나, 회전, 카메라의 움직임 등등을 체크하기 위해서, “객체를 그릴 버퍼를 생성하는 작업”을 시작한다.

[10]. 기존 DX9에서 버퍼 및 인덱스를 생성하는 과정에서는, 정점의 공간을 먼저 할당해서, Lock_UnLock함수로 그 할당된 공간을 뒤늦게 채우는 방식이었다면, 이제 DX11 에서는, 공간 할당함과 동시에, 바로 초기값을 넣어주게 된다. 더 빠르기 때문이고, 보통은 정적으로 버퍼를 만드는데, 이유는 동적으로 버퍼를 만들 때 보다 더 빠르고, 필요한 경우에만 동적으로 버퍼를 만들도록 한다. 정적 버퍼로 만들게 되면, 기존의 Lock_UnLock함수의 기능을 막아버려서, 게임의 프레임 속도를 낮추는 행위를 방지할 수 있게 된다.

[11]. Create_Buffer 함수에, 반환 값으로 m_pDevice→CreateBuffer 가 반환되는데, 장치에서의 CreateBuffer 함수의 파라미터 값을 채우기 위해, D3D11_BUFFER_DESC / D3D11_SUBRESOURCCE_DATA 구조체 변수를 멤버변수에 담는다.

[12]. D3D11_BUFFER_DESC 는, 내가 만들고자 하는 버퍼의 속성을 설정하는 구조체를 뜻하고, 주로 할당하고자 하는 크기, 동적인지 정적인지 설정 한다. D3D11_SUBRESOURCCE_DATA 는, 내가 지금 만드는 공간에 채워줄 초기값을 의미한다. 아까 말했듯이 DX11 에서는, 공간 할당과 동시에 바로 초기값을 넣어준다는 그 부분이다.

image.png

[13]. Engine 프로젝트에, VIBUffer 부모 클래스를 만들었으니, 필요한 구체적인 정점 버퍼 자식 클래스를 하나 만들어서, 초기값을 세팅하는 작업을 시작한다.

[14]. VIBuffer 클래스를 상속받는, VIBuffer_Rect 클래스를 하나 만들어서, 초기값 세팅 시작.

[15]. 부모 클래스인 VIBuffer 클래스에, 각 자식 정점 버퍼에서 필요로 하는 변수 제공 역할을 위해, 필요한 변수를 멤버로 선언해준다.

DXGI_FORMAT				m_eIndexFormat = {};
_uint							m_iNumVertexBuffers = {};
_uint							m_iNumVertices = {};
_uint							m_iVertexStride = {};
_uint							m_iNumIndices = {};
_uint							m_iIndexStride = {};

[16]. 이제 자식 VIBuffer_Rect 에 맞는 형식으로 저 변수의 초기값을 세팅한다.