1.1.2 왼손잡이 좌표계

왼손잡이 좌표계

1.3 내적

내적

세타 값이 90도이면 내적은 0

예각이면 양수

둔각이면 음수

 

1.4 외적

외적 : 두 벡터에 수직인 벡터를 출력

 

1.6 DirectXMath 라이브러리 벡터

SIMD : 128비트 너비의 레지스터

SIMD 명령들을 가지고 있는 라이브러리, 4차원 벡터 연산을 스칼라 연산 4개가 아니라 SIMD 명령 하나로 처리할 수 있다.

x86 플랫폼에서는 sse2(streaming simd extensions 2)옵션을 활성화 해줘야 하지만 x64 플랫폼에서는 따로 해 줄 필요 없다.

 

typedef __m128 XMVECTOR;

// XMVECTOR는 32비트값 4개로 구성된다.

 

지역변수와 전역 변수에는 XMVECTOR를 쓰면 16바이트 경계에 자동으로 정렬이 된다.

클래스 자료 멤버에서는 XMVECTOR 대신 XMFLOAT2, XMFLOAT3, XMFLOAT4를 사용하는 것이 권장된다.

 

SIMD의 장점을 취하기 위해서는 XMFLOAT를 XMVECTOR 형식으로 바꿔서 계산하는 것이 좋으므로 

클래스의 정보를 계산을 위해 XMLoadFloat 함수를 사용하여 XMVECTOR형식으로 변환하고

계산후에 XMStoreFloat함수로 XMFLOAT형식으로 되돌린다.

 

1.6.3 XMVector를 매개변수로 전달 할 때

함수에 XMVector 인수를 전달 할때 

플랫폼과 컴파일러에 따라 SSE 레지스터를 사용할 수 있는 개수가 다르기 때문에 의존성을 없애기 위해

FXMVECTOR, GXMVECTOR, HXMVECTOR, CXMVECTOR 형식을 사용해야 한다.

XM_CALLCONV 호출 규약지시자를 사용해야 한다.

1 ~ 3번째 : FXMVECTOR

4번째 : GXMVECTOR

5 ~ 6번째 : HXMVECTOR

나머지 : CXMVECTOR

 

생성자에 대한 규칙은 다르다

1 ~ 3번째 : FXMVECTOR

나머지 : CXMVECOTR

그리고 XM_CALLCONV 호출 규약 지시자를 사용하지 말아야 한다.

 

1.6.4 상수 벡터

상수 벡터는 XMVECTORF32를 사용해야 한다.

중괄호 초기화 구문을 사용할 때에는 XMVECTORF32를 사용해야 한다.

 

1.6.7 설정함수

XMVECTOR XM_CALLCONV XMVectorZero(); // (0, 0, 0, 0)

XMVECTOR XM_CALLCONV XMVectorSplatOne(); // (1, 1, 1, 1)

XMVECTOR XM_CALLCONV XMVectorSet(float x, float y, float z, float w); // (x, y, z, w)

XMVECTOR XM_CALLCONV XMVectorReplicate(float s) // (s, s, s, s)

XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) // (v.x, v.x, v.x, v.x)

//Y Z 버전도 존재

 

1.6.8 벡터 함수들

길이 : xmvector3length

내적 : xmvector3dot

외적 : xmvector3cross

정규화 : xmvector3normalize

각도 : xmvector3anglebetweenvectors

proj perp : xmvector3componentsfromnormal ( 출력 매개변수 )

equal : xmvector3equal

 

XMVectorGetX // float 값 반환

// Y Z W도 있음

1.6.9 부동 소수점 오차

부동 소수점 수의 상등을 판정 할 때 

XMVector3NearEqual(벡터1, 벡터2, epsilon벡터) // 두 벡터의 차이가 epsilon벡터보다 작으면 true

 

연습문제 19번 - 다양한 함수 알아보기

 

상수

XM_PIDIV4 // 파이 / 4

XM_PIDIV2 // 파이 / 2

XM_PI // 파이

 

벡터 함수 (원소에 각각 적용)

XMVectorAbs // 절대값

XMVectorCos // cosine (라디안)

XMVectorLog // 밑이 2인 로그

XMVectorExp // 2의 거듭제곱

 

XMVectorPow(u, p) // u의 p승

 

XMVectorSqrt // 제곱근

 

XMVectorSwizzle (u, 2, 2, 1, 3) // 벡터 원소를 인덱스를 이용하여 재배치

 

XMVectorMultiply(u, v) // 각각의 원소를 곱함

XMVectorSaturate(u) // 0과 1사이로 자름

XMVectorMin(u, v) // 두 벡터중 작은 값의 원소를 선택

XMVectorMax(u, v) // 큰 값의 원소를 선택

 

 

'읽은 책 > DirectX 12를 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글

5. 렌더링 파이프라인  (0) 2022.06.14
4. Direct3D의 초기화(2)  (0) 2022.06.13
4. Direct3D의 초기화(1)  (0) 2022.06.13
3. 변환  (0) 2022.06.12
2. 행렬 대수  (0) 2022.06.11

+ Recent posts