2020년 7월 1일 수요일

DirectX 11 - 시작

1. 준비

디렉트 x 프로그래밍을 하려면 Software Development Toolkit 이 필요하다.

아래는 MS 가 제공하는 문서. 레퍼런스로 가장 유용하다.

C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D11

SDK 를 깔고 따로 위치 변경을 하지 않을 시, 위 경로에 샘플 파일들이 있다.

그중 튜토리얼이 초반에 학습하기에 적합하다.

최신 SDK 를 학습하려면 2010 어쩌고의 vcsproj 파일을 실행하자.

2. 연결하기

기준은 비주얼 스튜디오이다.

c++ 프로젝트를 console 말고 windows application 으로 하나 만들자.

Direct X SDK 는 비주얼 스튜디오에서 다운받은게 아니라서 따로 링크하고 디렉토리를 연결해야한다.

모든건 Project -> Property 에서 처리한다.

Linker -> Input -> Additional Dependencies 에

d3d11.lib

d3dxlid.lib

D3DCompiler.lib

Effectslid.lib

dxerr.lib

dxgi.lib

dxguid.lib

를 넣어준다.

Configuration Properites -> VC ++ Directories 에서

Executable 에

C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x86

Include 에

C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include

Library 에

C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86

를 넣자.

64 비트를 쓸거면 x86 에서 x64로 바꾸면 된다.

만약 다운받은 SDK 경로가 다르다면 그거에 따라 맞춰야한다.

이때 호환성을 위해서 매크로 설정을 하기도 한다. DH(Include를), DL(Lib를) 를 Property Manager -> .user 를 더블클릭해서 나오는 user_macro 에 추가하고, 위의 경로자리에 ;$(DH) 이런식으로 넣는다.

3. XMVECTOR

이하는 번거롭고 문제가 있다고 실무에서 dxd10math, dxd11math 를 쓰니 별 필요 없겠지만, 일단 책에서 소개하고 알아두면 좋을거 같긴 하니 메모해둔다.

D3DX 가 Direct X 9 까지 벡터계산을 지원했는데 11에 와서 XNA 라이브러리가 지원한다. 이 라이브러리는 128 비트 레지스터인 SIMD(single instruction multiple data) 레지스터를 사용하여 32 bit float 4개를 한번에 계산하는 SSE2(Streaming SIMD Extensions 2) 명령어 셋 (아마 기계어 수준) 을 사용한다. 하나의 명령어로 4d 벡터를 계산하므로 빠르다 <xnamath.h> 로 인클루드 하면 된다.

기본적으로 SIMD 가 지원하는 자료형은 XMVECTOR 이다. 근데 SIMD 는 사용되려면 주소가 16 비트로 나뉘어지도록 되어야한다. 그래서 클래스 등 주소 할당이 삐뚤빼뚤한데서는 XMFLOAT2, XMFLOAT3, XMFLOAT4 를 사용하도록 권장된다. 연산이 필요할 경우 이걸 XMVECTOR 로 변환해서 사용해야 하드웨어적 지원을 받는다.

아래는 Float 따리와 변환, 로드 함수.

1

2

3

4

5

6

7

8

9

10

11

12

13

// Loads XMFLOAT2 into XMVECTOR

XMVECTOR XMLoadFloat2(CONST XMFLOAT2 *pSource);

// Loads XMFLOAT3 into XMVECTOR

XMVECTOR XMLoadFloat3(CONST XMFLOAT3 *pSource);

// Loads XMFLOAT4 into XMVECTOR

XMVECTOR XMLoadFloat4(CONST XMFLOAT4 *pSource);

// Loads XMVECTOR into XMFLOAT2

VOID XMStoreFloat2(XMFLOAT2 *pDestination, FXMVECTOR V);

// Loads XMVECTOR into XMFLOAT3

VOID XMStoreFloat3(XMFLOAT3 *pDestination, FXMVECTOR V);

// Loads XMVECTOR into XMFLOAT4

VOID XMStoreFloat4(XMFLOAT4 *pDestination, FXMVECTOR V);

보면 FXMVECTOR 라는 생소한게 보일텐데, 함수 등에 XMVECTOR 를 넣을 때 규칙이 있기 때문이다.

처음 3개는 FXMVECTOR 로 , 나머지는 CXMVECTOR 로 보내라는 것이 그 규칙인데 이유는 운영체제 종류마다 SIMD 를 효율적으로 처리하는 방법이 다르기 때문이다. 이하 아래 참고.

파라미터 제외, 상수로 XMVECTOR를 쓸 때는 XMVECTORF32 를 사용해야한다. 위와 비슷한 이유겟거니 한다.

정수로 할 경우, XMVECTORU32 를 사용해야한다.

XMVECTOR 은 연산자 오버로딩이 되어있는데 안쓸꺼면 XM_NO_OPERATOR_OvERLOADS 를 정의하면 된다. 안쓰는 이유는 함수로 하는게 복잡한 계산일 때 더 빠르다나. 자세한건 컨트롤 클릭 해서 살펴보자.

행렬은 XMMATRIX 라는 클래스를 지원

4. D3DX10math

<D3DX10math.h> 가 Direct X 11 에서 여전히 쓰인다.

벡터 표현용 자료형으로 D3DXVECTOR2, D3DXVECTOR3, D3DXVECTOR4 구조체가 지원된다.

행렬 표현용 자료형으로 D3DXMATRIX 구조체가 지원된다.

평면 표현용 자료형으로 D3DXPLANE 구조체가 지원된다.

연산자 오버로딩 등 자세한건 컨트롤 클릭 해보자.

벡터연산용 함수는 D3DXVec3 으로 시작해서 계산 이름이 붙으니 비주얼 스튜디오의 자동완성기능을 활용하자.

행렬연산용 함수는 D3DXMatrix 으로 시작해서 ;;

평면연산용 함수는 D3DXPlane 으로 ;;

댓글 없음:

댓글 쓰기

List