그래픽스/DirectX12

[Directx12][1장]기초 수학 - 벡터 및 관련 라이브러리

우향우@ 2023. 3. 21. 21:25

기초 수학

1.벡터

벡터는 크기와 방향을 가진 수량이다.

힘, 변위, 속도등을 나타낸다.

2.벡터와 좌표계

벡터는 꼬리를 특정 기준계의 원점에 뒀을때 머리의 좌표를 이용하여 표현할 수 있다.

이때 어떤 기준계를 기준으로 하느냐에 따라 같은 벡터라도 다른 좌표로 표현될 수 있다.

선형대수학에서의 bais와 관련된 내용이다.

3.왼손잡이, 오른손잡이 좌표계 ★

DirectX3D는 왼손잡이 좌표계를 쓴다.

4.기본 벡터 연산 ★

덧셈: u + v = (ux + vx, uy + vy, uz + vz)

뺄셈: u - v = (ux - vx, uy - vy, uz - vz)

스칼라 곱: ku = (kux , kuy , kuz)

길이: 벡터의 길이

정규화: 단위벡터화

내적: 각 벡터의 길이곱 x cos각도 (각 요소들을 곱한뒤 다 더한 스칼라값)

외적: u x v = (uyvz-uzvy, uzvx-uxvz,uxvy-uyvx) (3차원벡터에만 정의)

두 벡터에 수직이다, 두 벡터로 이루어지는 평행사변형의 넓이만큼의 길이를 가진다. 벡터 방향은 벡터 순서에 따라 달라진다.

2차원 유사 외적 (수직벡터): (-y,x) (이 벡터와 이 벡터의 -는 기존 벡터의 수직)

5.점 ★

벡터를 이용하여 점을 표현하면 점+벡터등의 연산들을 그대로 사용할 수 있다.

하지만 벡터는 이동이 불가하지만 점은 이동이 가능하다는 차이등을 고려하여 이후에 4차원 벡터의 w좌표를 이용하여 점과 벡터를 구분하여 사용한다.

관련 라이브러리

1.DirectXMath ★

DirectXMath는 window8이상에서 지원되는 DirectX3D 응용 프로그램을 위한 표준 3차원 수학 라이브러리이다. 이는 windows SDK의 일부로 SSE2 명령 집합을 활용한다.

SIMD 명령들은 128bit 너비의 SIMD 레지스터를 이용하여 32비트의 float나 int 네개를 하나의 명령어로 한번에 처리할 수 있어 벡터계산등에 매우 효율이 좋다.

DirectXMath 라이브러리는 DIrectXMath.h로 사용가능하다.

또 추가적인 자료형식을 가진 DirectXPackedVector 라이브러리는 DirectXPackedVector.h로 사용가능하다.

2.벡터 타입들 (XMVECTOR, XMVECTORn) ★

DirectXMath에서는 XMVECTOR타입으로 벡터를 사용 할 수 있다.

이 타입을 사용하면 SIMD의 장점을 활용하여 여러 벡터 연산을 수행 할 수 있다.

하지만 XMVECTOR타입은 16바이트 경계 정합(정렬)문제로 지역변수, 전역변수에서는 사용 가능하나 클래스 자료 멤버로는 사용이 권장되지 않는다.

따라서 클래스 자료 멤버로는 XMFLOAT2(2차원), XMFLOAT3(3차원), XMFLOAT4(4차원)를 사용한다.

이때 이 타입들은 SIMD기능을 제공하지 않는 타입이기에 연산전 XMVECTOR로 데이터를 옮긴후 연산을 수행하고 다시 이 타입들에 옮겨 담아야한다.

XMVECTOR와 XMFLOATn타입 간의 데이터 이동은 다음 적재 저장함수들을 사용한다.

23p참고

3.XMVECTOR 매개변수 규칙 ★

XMVECTOR를 함수의 매개변수로 사용할때는 해당 데이터가 스택이 아닌 SSE/SSE2레지스터를 통해 전달되어야 효율적이다. 그리고 환경별로 지원되는 레지스터 갯수등이 다르기 때문에 이러한 의존성을 없애기 위해 다음의 규칙을 따른다.

1.이렇게 처리할 함수는 XM_CALLCONV라는 호출 규약 지시자를 달아서 선언한다.

2. XMVECTOR매개변수는 다음과 같이 표기하여 사용한다.

처음 세개: FXMVECTOR

넷째: GXMVECTOR

다섯,여섯째: HXMVECTOR

그 이상: CXMVECTOR

이는 환경별로 typedef에 의해 앞부분 몇개는 XMVECTOR로, 나머지 뒷부분은 XMVECTOR&로 전처리 된다.

이때 XMVECTOR로 써진 부분만 SSE/SSE2레지스터로 전송되고 XMVECOTR&로 쓰여진 부분은 스택으로 처리된다.

따라서 저런식으로 매개변수를 적어주면 환경에 따라 적절한 갯수의 XMVECTOR만 SSE/SSE2로 처리되고 나머지는 스택으로 처리되는 식으로 되어 환경에 맞게 각자 처리 할 수 있게된다.

예시)

inline XMMATRIX XM_CALLCONV XMMatrixTransformation(
FXMVECTOR ScalingOrigin,
FXMVECTOR ScalingOrientationQuaternion,
FXMVECTOR Scaling,
GXMVECTOR RotationOrigin,
HXMVECTOR RotationQuaternion,
HXMVECTOR Translation,
);

4.상수 XMVECTOR

XMVECTOR를 상수로 사용하고 싶다면 XMVECTOR32라는 다른 형식을 따로 사용하면 더 효율적이다.

5.XMVECTOR 연산자

XMVECTOR는 벡터에 대한 연산들이 연산자 오버로딩 되어있다.

27p참조

6.스칼라 상수 및 기타 함수

DirectXMath는 PI등의 대표적인 상수를 float등으로 리턴해주는 함수들을 가지고 있다.

또한 라디안-디그리 변환등의 함수들도 제공해준다.

28p참조

7.XMVECTOR 설정함수

DirectXMath는 XMVECTOR의 전체 값이나 일부 값을 설정하거나 특정 XMVECTOR를 리턴해주는 함수들을 제공한다.

28P참조

8.XMVECTOR 연산함수

DirectXMath는 XMVECTOR에 대해 다양한 벡터연산을 위한 함수도 제공해준다.

30p참조

9.부동소수점 오차

컴퓨터에서는 부동소수점을 사용할때는 언제나 부동소수점 오차를 경계해야한다.

이러한 부동소수점 오차에 대비해야하는 환경에서는 상등을 판정할때 완전히 같은지가 아닌 둘 사이의 오차가 허용오차 이내인지를 이용하여 근사를 판정한다.

DirectXMath에서는 XMVector3NearEqual이라는 두 XMVECTOR가 허용오차 내에서의 상등인지 판정하는 함수를 제공해준다.

36p참조

참고서적

DirectX 12를 이용한 3D 게임 프로그래밍 입문