※ DirectXMath 란?
- WIndow 8 이상에서 DirectX3D 응용 프로그램을 위한 표준 3차원 수학 라이브러리이다. Windows SDK의 일부인 이 라이브러리는 SSE2(Streaming SIMD Extensions 2) 명령 집합을 활용한다.
▶ SIMD (single instruction multiple data)란?
하나의 명령으로 여러데이터를 처리한다.
▶ SSE2(Streaming SIMD Extensions 2)란?
128비트 너비의 SIMD레지스터를 이용해서 float, int와 같은 32비트 데이터 4개를 한꺼번에 처리한다.
그래서 벡터계산을 아주 유용하게 할 수 있다.
# 참고자료
https://m.blog.naver.com/fs0608/221650925743
https://www.secmem.org/blog/2022/02/15/Intel-Intrinsics-Guide/
▶ X86(32bit)에서 SSE2 사용 할때 주의사항
- SSE2를 활성화 해야된다. x64는 상관없이 다된다.
( 프로젝트속성 > 구성 속성 > C/C++ > 코드 생성 > 고급 명령 집합 사용)
※ 사용해보기.(여기에선 visual studio community 2019로 작업한다.)
▶ 빈 프로젝트를 만든다.
▶ C++ 소스파일을 만든다
▶ 여기서 X84로 사용해서 SSE2사용 체크를 한다.
▶ DirectXMath.h 추가 및 DirectX 네임스페이스 사용
여기까지 됬으면 사용할 준비는 끝났다.
※ 벡터 형식들 알아보기
▶ XMVECTOR
- DirectXMath에서 핵심 벡터 형식은 SIMD 하드웨어 레지스터에 대응되는 XMVECTOR이다.
이 XMVECTOR는 128비트의 크기의 32비트 부동소수점 값 4개로 구성되어있고 한번 명령
으로 4개를 처리할 수 있다. 정의는 다음과 같다.
typedef __m128 XMVECTOR;
SIMD의 장점을 쓰려면 벡터가 XMVECTOR 형식으로 바껴야 된다.
이 형식으로 3차원 ,2차원 값을 처리할 수 있다. 쓰이지 않는 성분들은 0으로 설정하면 된다.
- XMVECTOR는 16바이트에 경계에서 정합(alignment) 되어야 한다. 그래서 자동으로 정합이
일어나는 지역변수나 전역변수에서 사용된다.
▶ XMFLOAT2 , XMFLOAT3 , XMFLOAT4
- 벡터 성분들을 담는 구조체이다. 클래스 멤버 자료형으로 사용되는 걸 권장된다.
1) FLOAT2 : 2차원 벡터값을 담는 구조체
2) FLOAT3 : 3차원 벡터 값을 담는 구조체
3) FLOAT4 : 4차원 벡터 값을 담는 구조체
FLOAT2 , FLOAT3, FLOAT4 벡터 연산은 가능하다. 하지만 SIMD의 장점을 사용해서 계산하는
것이 효과적이기 때문에 XMVECTOR 형식으로 변환해야 한다.
▶ XMLoadFloat2 , XMLoadFloat3 , XMLoadFloat4
- XMLoadFloat는 XMFLOAT -> XMVECTOR에 변환해서 저장을 할 수 있게 도와주는 함수이다.
이것을 XMFLOAT -> XMVECTOR에 적재한다고 표현한다.
▶ XMStoreFloat2 , XMStoreFloat3 , XMStoreFloat4
- XMStoreFloat는 XMVECTOR -> XMFLOAT에 변환해서 저장을 할 수 있게 도와주는 함수이다.
이것을 XMVECTOR-> XMFLOAT에 저장한다고 표현한다.
▶ XMVectorGetX , XMVectorGetY , XMVectorGetZ , XMVectorGetW
- 이것은 XMVECTOR의 특정 성분만 읽고 싶을 때 사용하는 함수들이다.
▶ XMVectorSetX , XMVectorSetY , XMVectorSetZ , XMVectorSetW
- 이것은 XMVECTOR의 특정 성분만 변경하고 싶을 때 사용하는 함수들이다.
# 실제 사용
# 정리
1. 지역변수나 전역변수에는 XMVECTOR를 사용한다.
2. 클래스 자료 멤버에 XMFLOAT2 , XMFLOAT3 , XMFLOAT4를 사용한다.
3. 계산을 수행하기 전에 적재(Load) 함수들을 이용해서 XMFLOAT 을 XMVECTOR로 변환한다.
4. XMVECTOR 인스턴스들로 계산을 수행한다.
5. 저장 함수들을 이용해서 XMVECTOR를 XMFLOAT으로 변환한다.
'Directx12 > DirectX 내용' 카테고리의 다른 글
DirectXMath 라이브러리의 벡터(3) (0) | 2022.08.15 |
---|---|
DirectXMath 라이브러리의 벡터(2) (0) | 2022.08.14 |