다이렉트 X 8에서 9로 바꾸기


다이렉트 9.0으로 오면서 8.0과 사용법이 다르다.
주황색으로 있는게 9.0C 버전이고 위에 있는 코드가 8.0 버전이다.
directx8.0의 tutorial06을 9.0버전으로 바꾸었다.

tutorial06과 카메라 셋팅 함수 SetupCamera()를 추가했다.

선택 대화 상자 떠는 프로그램이 full이고 안떠는 프로그램이 test이다.
shader9.0의 tutorial01과 중복된 설명이 많을 것이다.

솔직히 말해서 카피한거지만..... 그럼 시작해보자.

1. 헤더파일과 라이브러리 교체

#include <d3d8.h>
#include <d3dx8.h>
#pragma comment (lib, "dxguid.lib")
#pragma comment (lib, "d3d8.lib")
#pragma comment (lib, "d3dx8.lib") 

#include <time.h>

#include <d3d9.h>
#include <d3dx9.h>

#pragma comment (lib, "dxguid.lib")
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
#pragma comment (lib, "winmm.lib")

헤더파일과 라이브러리를 9로 교체한다.

이후로 timeGetTime()함수를 사용하기 헤더파일 time.h파일과 라이브러리 winmm.lib를 포함 시켰다.


2. 인터페이스 교체

LPDIRECT3D8                            g_d3d        = NULL; // our main d3d8 interface
LPDIRECT3DDEVICE8                  g_d3d_Device = NULL; // our d3d8 device
LPDIRECT3DVERTEXBUFFER8      g_VertexBuffer = NULL; // our VertexBuffer
D3DPRESENT_PARAMETERS       g_d3dpp;

LPDIRECT3D9                                 g_d3d        = NULL; // our main d3d8 interface
LPDIRECT3DDEVICE9                       g_d3d_Device = NULL; // our d3d8 device
LPDIRECT3DVERTEXBUFFER9           g_VertexBuffer = NULL; // our VertexBuffer
D3DPRESENT_PARAMETERS            g_d3dpp;



3. 다이렉트 X 인터페이스 생성

LPDIRECT3D8 p_d3d = Direct3DCreate8 (D3D_SDK_VERSION);
int allVideoModes = p_d3d->GetAdapterModeCount (D3DADAPTER_DEFAULT);

..................

p_d3d->EnumAdapterModes (D3DADAPTER_DEFAULT, i, &g_pd3ddm[i]);

LPDIRECT3D9 p_d3d = Direct3DCreate9 (D3D_SDK_VERSION);
int allVideoModes = p_d3d->GetAdapterModeCount (D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8);

...................

p_d3d->EnumAdapterModes (D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, i, &g_pd3ddm[i]);

인테페이스 생성이야 그냥 9로 고쳐 주면 되고,
GetAdapterModeCount()는 조금 바뀌었다. 두 번째 파라메터에 D3DFORMAT을 지정해주는 것이 추가 되었다.
EnumAdapterModes() 역시 두 번째 파라메터 D3DFORMAT을 지정해 주어야 한다.


4. D3DPRESENT 구조체 교체

g_d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;

        //버텍스 프로세싱 결정
        D3DCAPS9 caps;
        D3DDEVTYPE deviceType = D3DDEVTYPE_HAL;
        g_d3d->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
        int vertexProcessing = 0;
        if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
                vertexProcessing = D3DCREATE_HARDWARE_VERTEXPROCESSING;
        else
                vertexProcessing = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;

 

CreateDevice()에 소프트웨어 버텍스 프로세싱으로 할 것인지 하드웨어 버텍스 프로세싱으로 처리할건지 결정하는 코드를 추가 하였다


5. CreateVertexBuffer 변화

g_d3d_Device->CreateVertexBuffer(7*sizeof(CUSTOMVERTEX),   
                          0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer)

g_d3d_Device->CreateVertexBuffer(7*sizeof(CUSTOMVERTEX),
                          0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer, NULL)

마지막 인자 pSharedhandle이 추가 되었는데, 이용되지 않으며 NULL로 채운다.


6. SetStreamSource, SetVertexShader 변화

    g_d3d_Device->SetVertexShader (D3DFVF_CUSTOMVERTEX);
    g_d3d_Device->SetStreamSource (0, g_VertexBuffer, sizeof(CUSTOMVERTEX));

    g_d3d_Device->SetFVF (D3DFVF_CUSTOMVERTEX);
    g_d3d_Device->SetStreamSource (0, g_VertexBuffer, 0, sizeof(CUSTOMVERTEX));

8에서 사용하던 SetVertexShader()는 9에서는 셰이더를 설정할 때만 사용된다.
9에서 고정파이프라인의 버텍스 타입은 어떻게 셋팅하냐면 SetFVF를 사용한다.

SetStreamSource()도 바뀌었다. 9.0버전에 세 번째 파라메터가 추가 되었다. 뭐하는지는 9.0문서가 없어서 그냥 넘어간다.
 

[펌]
~~~~~~~~~~~~~~~~~~~~~