시작(DirectXMath)
DirectXMath 라이브러리는 단정밀도 부동 소수점 벡터(2D, 3D 및 4D) 또는 행렬(3×3 및 4×4)에서 산술 및 선형 대수 작업을 위한 최적의 이식 가능한 인터페이스를 구현합니다. 라이브러리에는 정수 벡터 작업에 대한 지원이 제한되어 있습니다. 이러한 작업은 그래픽 프로그램에서 렌더링 및 애니메이션에 광범위하게 사용됩니다. 배정밀도 벡터(longs, shorts 또는 bytes 포함)는 지원되지 않으며 제한된 정수 벡터 작업만 지원됩니다.
라이브러리는 다양한 Windows 플랫폼에서 사용할 수 있습니다. 라이브러리는 이전에 사용할 수 없는 기능을 제공하므로 이 버전은 다음 라이브러리를 대체합니다.
- Xboxmath.h 헤더에서 제공하는 Xbox 수학 라이브러리
- D3DX 9 DLL에서 제공하는 D3DX 9 라이브러리
- D3DX 10 DLL을 통해 제공되는 D3DX 10 수학 라이브러리
- DirectX SDK 및 Xbox 360 XDK의 xnamath.h 헤더에서 제공하는 XNA 수학 라이브러리
이 섹션에서는 시작의 기본 사항을 간략하게 설명합니다.
다운로드
DirectXMath 라이브러리는 Windows SDK에 포함되어 있습니다. 또는 GitHub/Microsoft/DirectXMath에서 다운로드할 수 있습니다. 이 사이트에는 관련 샘플 프로젝트도 포함되어 있습니다.
Run-Time 시스템 요구 사항
DirectXMath 라이브러리는 사용할 수 있는 경우 벡터 작업에 특수 프로세서 지침을 사용합니다. 프로그램이 "알 수 없는 명령 예외" 오류를 생성하지 않도록 하려면 DirectXMath 라이브러리를 사용하기 전에 XMVerifyCPUSupport를 호출하여 프로세서 지원을 검사.
다음은 기본 DirectXMath 라이브러리 런타임 지원 요구 사항입니다.
- Windows(x86/x64) 플랫폼의 기본 컴파일에는 SSE/SSE2 명령 지원이 필요합니다.
- Windows RT 플랫폼의 기본 규격에는 ARM-NEON 명령 지원이 필요합니다.
- 정의된 _XM_NO_INTRINSICS_ 사용하여 컴파일하려면 표준 부동 소수점 작업만 지원해야 합니다.
참고
XMVerifyCPUSupport를 호출할 때 DirectXMath.h를 포함하기 전에 windows.h>>를 포함합니다<<. DirectXMath.h를 사용하는 <모든 모듈에 <windows.h를 포함<할 필요가 없도록 windows.h>>의 콘텐츠가 필요한 라이브러리의 유일한 함수입니다.>
디자인 개요
DirectXMath 라이브러리는 주로 C++ 프로그래밍 언어를 지원합니다. 라이브러리는 헤더 파일 DirectXMath*.inl, DirectXPackedVector.inl 및 DirectXCollision.inl의 인라인 루틴을 사용하여 구현됩니다. 이 구현은 고성능 컴파일러 내장 함수를 사용합니다.
DirectXMath 라이브러리는 다음을 제공합니다.
- SSE/SSE2 내장 함수를 사용하는 구현입니다.
- 내장 함수가 없는 구현입니다.
- ARM-NEON 내장 함수를 사용하는 구현입니다.
라이브러리는 헤더 파일을 사용하여 배달되므로 소스 코드를 사용하여 사용자 고유의 앱을 사용자 지정하고 최적화합니다.
행렬 규칙
DirectXMath는 행 주 행렬, 행 벡터 및 사전 곱셈을 사용합니다. Handedness는 사용되는 함수 버전(RH 및 LH)에 따라 결정되며, 그렇지 않으면 함수는 왼손 또는 오른손 보기 좌표에서 작동합니다.
참고로 Direct3D는 지금까지 왼손 좌표계, 행 주 행렬, 행 벡터 및 사전 곱셈을 사용했습니다. 최신 Direct3D에는 왼쪽 및 오른손 좌표에 대한 강력한 요구 사항이 없으며 일반적으로 HLSL 셰이더는 기본적으로 열 주 행렬을 사용합니다. 자세한 내용은 HLSL 행렬 순서 지정을 참조하세요.
기본 사용
DirectXMath 라이브러리 함수를 사용하려면 DirectXMath.h, DirectXPackedVector.h, DirectXColors.h 및/또는 DirectXCollision.h 헤더를 포함합니다. 헤더는 Windows 스토어 앱용 Windows 소프트웨어 개발 키트에서 찾을 수 있습니다.
유형 사용 지침
XMVECTOR 및 XMMATRIX 형식은 DirectXMath 라이브러리의 작업 말입니다. 모든 작업은 이러한 형식의 데이터를 사용하거나 생성합니다. 라이브러리를 사용하는 것이 핵심입니다. 그러나 DirectXMath는 SIMD 명령 집합을 사용하므로 이러한 데이터 형식에는 여러 가지 제한 사항이 적용됩니다. DirectXMath 함수를 잘 활용하려면 이러한 제한을 이해하는 것이 중요합니다.
XMVECTOR는 SIMD 하드웨어 레지스터의 프록시로, XMMATRIX는 4개의 SIMD 하드웨어 레지스터의 논리적 그룹화에 대한 프록시로 간주해야 합니다. 이러한 형식은 제대로 작동하려면 16바이트 맞춤이 필요함을 나타내기 위해 주석이 추가됩니다. 컴파일러는 로컬 변수로 사용될 때 스택에 자동으로 올바르게 배치하거나 전역 변수로 사용될 때 데이터 세그먼트에 배치합니다. 적절한 규칙을 사용하면 함수에 매개 변수로 안전하게 전달할 수도 있습니다(자세한 내용은 호출 규칙 참조).
그러나 힙의 할당은 더 복잡합니다. 따라서 XMVECTOR 또는 XMMATRIX 를 힙에서 할당할 클래스 또는 구조체의 멤버로 사용할 때마다 주의해야 합니다. Windows x64에서 모든 힙 할당은 16 바이트 정렬되지만 Windows x86의 경우 8 바이트만 정렬됩니다. 16바이트 맞춤을 사용하여 힙에서 구조를 할당하는 옵션이 있습니다(할당 적절하게 정렬 참조). C++ 프로그램의 경우 연산자 new/delete/new[]/delete[] 오버로드(전역적으로 또는 클래스별)를 사용하여 원하는 경우 최적의 맞춤을 적용할 수 있습니다.
참고
new/delete를 오버로드하여 C++ 클래스에서 직접 맞춤을 적용하는 대신 pImpl 관용구를 사용할 수 있습니다. Impl 클래스가 내부적으로 _aligned_malloc 통해 정렬되도록 하는 경우 내부 구현 내에서 정렬된 형식을 자유롭게 사용할 수 있습니다. 이 옵션은 'public' 클래스가 Windows 런타임 ref 클래스이거나 std::shared_ptr<> 사용하기 위한 것이며, 그렇지 않으면 신중한 정렬을 방해할 수 있습니다.
그러나 클래스 또는 구조에서 직접 XMVECTOR 또는 XMMATRIX 를 사용하지 않도록 하는 것이 더 쉽고 컴팩트한 경우가 많습니다. 대신 XMFLOAT3, XMFLOAT4, XMFLOAT4X3, XMFLOAT4X4 등을 구조체의 멤버로 사용합니다. 또한 벡터 로드 및 벡터 스토리지 함수를 사용하여 데이터를 XMVECTOR 또는 XMMATRIX 지역 변수로 효율적으로 이동하고, 계산을 수행하고, 결과를 저장할 수 있습니다. 이러한 데이터 형식의 배열에서 직접 효율적으로 작동하는 스트리밍 함수(XMVector3TransformStream, XMVector4TransformStream 등)도 있습니다.
벡터 만들기
상수 벡터
많은 작업을 수행하려면 벡터 계산에서 상수를 사용해야 하며, 원하는 값으로 XMVECTOR 를 로드하는 방법에는 여러 가지가 있습니다.
XMVECTOR의 모든 요소에 스칼라 상수를 로드하는 경우 XMVectorReplicate 또는 XMVectorReplicateInt를 사용합니다.
XMVECTOR vFive = XMVectorReplicate( 5.f );
고정 값이 다른 벡터 상수를 XMVECTOR로 사용하는 경우 XMVECTORF32, XMVECTORU32, XMVECTORI32 또는 XMVECTORU8 구조를 사용합니다. 그런 다음 XMVECTOR 값을 전달하는 모든 위치에서 직접 참조할 수 있습니다.
static const XMVECTORF32 vFactors = { 1.0f, 2.0f, 3.0f, 4.0f };
참고
XMVECTOR에서 직접 이니셜라이저 목록을 사용하지 마세요(즉, XMVECTOR v = { 1.0f, 2.0f, 3.0f, 4.0f }). 이러한 코드는 비효율적이며 DirectXMath에서 지원하는 모든 플랫폼에서 이식할 수 없습니다.
DirectXMath에는 코드(g_XMOne, g_XMOne3, g_XMTwo, g_XMOneHalf, g_XMHalfPi, g_XMPi 등)에서 사용할 수 있는 미리 정의된 여러 전역 상수가 포함되어 있습니다. DirectXMath.h 헤더에서 XMGLOBALCONST 값을 검색합니다.
일반적인 RGB 색(빨강, 녹색, 파랑, 노랑 등)에 대한 벡터 상수 집합이 있습니다. 이러한 벡터 상수에 대한 자세한 내용은 DirectXColors.h 및 DirectX::Colors 네임스페이스를 참조하세요.
변수의 벡터
단일 스칼라 변수에서 벡터를 만드는 경우 XMVectorReplicate 및 XMVectorReplicateInt를 참조하세요.
XMVECTOR v = XMVectorReplicate( f );
4개의 스칼라 변수에서 벡터를 만드는 경우 XMVectorSet 및 XMVectorSetInt를 참조하세요.
XMVECTOR v = XMVectorSet( fx, fy, fz, fw );
벡터의 벡터
특정 구성 요소가 변수로 설정된 다른 벡터에서 벡터를 만드는 경우 벡터 접근자 함수를 사용하는 것이 좋습니다.
XMVECTOR v2 = XMVectorSetW( v1, fw );
단일 구성 요소가 복제된 다른 벡터에서 벡터를 만드는 경우 XMVectorSplatX, XMVectorSplatY, XMVectorSplatZ 및 XMVectorSplatW를 사용합니다.
XMVECTOR vz = XMVectorSplatZ( v );
순서가 다시 지정된 구성 요소를 사용하여 다른 벡터 또는 벡터 쌍에서 벡터를 만드는 경우 XMVectorSwizzle 및 XMVectorPermute를 참조하세요.
XMVECTOR v2 = XMVectorSwizzle<XM_SWIZZLE_Z, XM_SWIZZLE_Y, XM_SWIZZLE_W, XM_SWIZZLE_X>( v1 ); XMVECTOR v3 = XMVectorPermute<XM_PERMUTE_0W, XM_PERMUTE_1X, XM_PERMUTE_0X, XM_PERMUTE_1Z>( v1, v2 );
메모리의 벡터
- 메모리에서 단일 부동 소수점 값을 로드하려면 XMVectorReplicatePtr, XMVectorReplicateIntPtr, XMLoadFloat 및 XMLoadInt를 참조하세요.
- 부동 배열을 로드하는 일반적인 방법은 XMLoadFloat2, XMLoadFloat3, XMLoadFloat4, XMLoadFloat3x3, XMLoadFloat4x3 및 XMLoadFloat4x4입니다.
- DirectXMath에는 다양한 데이터 구조 및 일반적인 GPU 형식을 처리하기 위한 다양한 형식 및 관련 로드 및 저장소 집합이 포함되어 있습니다. 벡터 로드 및 벡터 저장소를 참조하세요.
벡터에서 구성 요소 추출
SIMD 처리는 데이터를 SIMD 레지스터에 로드하고 결과를 추출하기 전에 완전히 처리할 때 가장 효율적입니다. 스칼라와 벡터 양식 간의 변환은 비효율적이므로 필요한 경우에만 변환하는 것이 좋습니다. 이러한 이유로 스칼라 값을 생성하는 DirectXMath 라이브러리의 함수는 결과 벡터(즉, XMVector2Dot, XMVector3Length 등)에서 스칼라 결과가 복제되는 벡터 형식으로 반환됩니다. 그러나 스칼라 값이 필요한 경우 이에 대한 몇 가지 선택 항목은 다음과 같습니다.
단일 스칼라 답변이 계산되는 경우 Vector 접근자 함수를 사용하는 것이 적절합니다.
float f = XMVectorGetX( v );
벡터의 여러 구성 요소를 추출해야 하는 경우 메모리 구조에 벡터를 저장하고 다시 읽어 보세요. 예:
XMFLOAT4A t; XMStoreFloat4A( &t, v ); // t.x, t.y, t.z, and t.w can be individually accessed now
가장 효율적인 형태의 벡터 처리는 메모리에서 입력 데이터가 로드되고( 벡터 로드 함수 사용), SIMD 형식으로 완전히 처리된 다음 메모리에 기록되는 메모리 간 스트리밍( 벡터 저장소 함수 사용)을 사용하는 것입니다.
관련 항목