PART 2 Two Direct3D 기 초
Direct3D 기초 1장 : Direct3D 초기화 2장 : 렌더링 파이프 라인 3장 : Direct3D 내에서의 드로잉 4장 : 색상 5장 : 조명 6장 : 텍스처링 7장 : 블렌딩 8장 : 스텐실 2009-1학기 컴퓨터게임(DirectX)
Direct3D 개요 Direct3D는 3D 가속 하드웨어를 이용해 3D 세계를 표현할 수 있도록 해주는 저수준 그래픽 API 애플리케이션 Direct3D HAL 그래픽 장치 2009-1학기 컴퓨터게임(DirectX)
장치로 하여금 특별한 작업을 수행하도록 하는 장치고유의 코드 Direct3D와 그래픽 장치 사이에는 HAL(하드웨어 추상 층: Hardware Abstraction Layer)라 하는 중간 단계 존재 장치로 하여금 특별한 작업을 수행하도록 하는 장치고유의 코드 장치제조사에서 HAL을 구현할 때 장치에서 지원하지 않는 Direct3D 기능은 HAL에 포함되지 않으며, 소프트웨어 애뮬레이션이 가능한 버텍스 처리 작업을 제외하고 HAL 에서 구현하지 않는 Direct3D 함수 호출은 오류 발생 여러가지 그래픽 카드를 Direct3D가 모두 제어 불가능 HAL에게 그 기능을 위임하여 독립적으로 수행가능하게 함 2009-1학기 컴퓨터게임(DirectX)
REF 장치 하드웨어 장치에서는 제공하지 않으나 Direct3D에서 제공하는 기능을 이용할 경우, DIrect3D API를 소프트웨어로 애뮬레이트 하는 레퍼런스 래스터라이저(REF 장치)를 제공 이를 통해 장치에서 지원하지 않는 Direct3D 기능을 이용, 테스트 Ex) shader를 지원하지 않는 그래픽 카드를 사용할 경우 REF 장치를 이용해야 한다. REF 장치는 순수한 개발 목적으로만 사용, DirectX SDK에만 포함되며 최종사용자에게는 배포 못함. 2009-1학기 컴퓨터게임(DirectX)
D3DDEVTYPE HAL 장치는 D3DDEVTYPE 열거형 멤버인 D3DDEVTYPE_HAL로 지정 REF 장치는 D3DDEVTYPE 열거형 멤버인 D3DDEVTYPE_REF로 지정 우리의 장치를 만들 때에는 어떤 타입을 원하는지를 지정해야 하므로 이들 타입에 대해 기억해야 함 2009-1학기 컴퓨터게임(DirectX)
COM 컴포넌트 객체 모델(COM)은 DirectX 프로그래밍 언어에 독립적으로 만들어주고 하위 호환성을 갖추게 할 수 있는 기술 다른 COM 인터페이스의 메서드나 특수한 함수를 통해 COM 인터페이스의 포인터를 얻음 즉, C++ new 키워드로 COM 인터페이스를 만드는 것이 아님 인터페이스 이용 작업이 끝나면 우리가 직접 이를 지우는 것이 아니라 인터페이스의 Release 메서드를 호출해야 함 COM 인터페이스는 접두어로 대문자 I를 가진다. (예) 표면을 나타내는 COM 인터페이스의 이름은 IDirect3DSurface 이다. 2009-1학기 컴퓨터게임(DirectX)
표면(surface) 표면은 주로 2D 이미지 데이터를 보관하는데 이용하는 픽셀의 행렬이다. 실제로 픽셀 데이터는 선형 배열에 보관된다. 피치 너비 표면의 요소 - 픽셀 +X [0,0] [0,2] [1.0] 피치영역 높이 2009-1학기 +Y 컴퓨터게임(DirectX)
피치는 바이트로 계산, 하드웨어 구현에 따라 가변적이기 때문에 표면의 너비와 높이는 픽셀 단위로 계산 피치는 바이트로 계산, 하드웨어 구현에 따라 가변적이기 때문에 피치 = 너비 * sizeof(pixelformat)라고 가정할 수는 없다. 코드의 표면을 이용하는 데는 IDirect3DSurface9 인터페이스가 사용된다. 다음은 IDirect3DSurface9 의 중요한 메서드들 LockRect : 표면 메모리로의 포인터 제공 UnlockRect : LockRect를 호출, 메모리에 대한 작업이 끝난 뒤에는 이 메서드를 호출하여 잠금 해제 GetDesc : 표면에 대한 정보를 D3DSURFACE_DESC 구조체를 통해 얻는다. 2009-1학기 컴퓨터게임(DirectX)
표면을 잠그고 각 픽셀을 빨간색으로 지정하는 코드 // _surface가 IDirect3DSurface9 인터페이스로의 포인터라고 // 가정, 32 비트 픽셀 포맷을 이용한다고 가정 // 표면 정보를 얻는다. D3SURFACE_DESC surfacedesc; _surface->GetDesc(&surfacedesc); // 표면 픽셀 데이터로의 포인터를 얻는다. D3DLOCKED_RECT lockedRect; _surface->LockRect( &lockedRect, // 잠근 데이터를 얻을 포인터 0, // 전체 표면을 잠근다. 0); // 잠근 플래그를 지정하지 않는다. 2009-1학기 컴퓨터게임(DirectX)
// 표면의 각 픽셀을 대상으로 반복하여 픽셀을 빨간색으로 지정 DWORD* imageData = (DWORD*) lockedRect.pBits; for (int i = 0; i < surfaceDesc.Height; i++) { for (int j = 0; j < surfaceDesc.Width; j++) // 피치는 바이트 단위이며 DWORD당 4바이트이므로 // 피치를 4로 나눔 int index = i * lockedRect.Pitch / 4 + j; imageData(index) = 0xffff0000; // red } _surface->UnlockRect(); 2009-1학기 컴퓨터게임(DirectX)
Typedef struct _D3DLOCKED_RECT { INT Pitch; // 표면 피치 void *pBits; // 표면 메모리 시작을 가리키는 포인터 } D3DLOCKED_RECT; 2009-1학기 컴퓨터게임(DirectX)
멀티 샘플링 픽셀 매트릭스로 이미지를 표현할 때 나타나는 거친 이미지를 부드럽게 만드는데 이용되는 기술 D3DMULTISAMPLE_TYPE 열거형은 표면에 적용할 멀티 샘플링 레벨을 지정할 수 있도록 하는 값들로 구성 D3DMULTISAMPLE_NONE : 멀티 샘플링을 지정하지 않는다. D3DMULTISAMPLE_1_SAMPLE … 16_SAMPLE : 1에서 16까지의 멀티 샘플링 레벨 지정 멀티샘플링은 어플리케이션의 속도를 지나치게 떨어뜨림. 멀티샘플링을 이용할 때는 IDIRECT3D9::CheckDeviceMultiSampleType 메서드 이용 2009-1학기 컴퓨터게임(DirectX)
픽셀 포맷 표면이나 텍스처를 만들기 위해서는 Direct3D 자원의 픽셀 포맷을 지정해야 함 D3DFMT_R8G8B8 - 24비트 픽셀 포맷 지정 가장 왼쪽의 8비트는 적색, 다음, 녹색, 다음 파란색 D3DFMT_X8R8G8B8 - 32비트 픽셀 포맷 지정 가장 왼쪽은 사용되지 않음 D3DFMT_A8R8G8B8 - 32비트 픽셀 포맷 지정 가장 왼쪽은 알파값 D3DFMT_A16B16G16R16F – 64비트 부동 소수점 알파16, 블루16, 그린16, 레드16 비트 할당. D3DFMT_A32B32G32R32F – 128비트 포맷 2009-1학기 컴퓨터게임(DirectX)
메모리 풀 표면이나 그 밖의 다양한 Direct3D 자원들은 여러가지 종류의 메모리 풀에 보관 가능 메모리 풀은 D3DPOOL 열거형 멤버로 지정 D3DPOOL_DEFAULT : 자원의 타입과 이용 방식에 가장 적합한 자원들을 메모리에 보관하도록 요청 D3DPOOL_MANAGED : 관리 풀에 보관된 자원은 Direct3D에 의해 관리,(필요에 따라 자동으로 옮겨짐) D3DPOOL_SYSTEMMEM : 시스템 메모리 내에 보관될 자원 지정 D3DPOOL_SCRATCH : 시스템 메모리 내에 보관될 자원 지정. 이 풀의 자원은 그래픽장치의 제한을 따르지 않음. 2009-1학기 컴퓨터게임(DirectX)
스왑 체인과 페이지 플리핑 Direct3D는 보통 두 개나 세 개의 표면을 하나의 컬렉션으로 관리(스왑 체인이라고 함) IDirect3DSwapChain9 인터페이스를 통해 이용 대부분은 Direct3D가 직접 관리 스왑 체인과 페이징 플리핑 기술은 프레임 간의 부드러운 애니메이션을 제공하기 위한 것 2009-1학기 컴퓨터게임(DirectX)
전면 버퍼 표면의 디스플레이가 완료되면 스왑 체인의 끝으로 돌아가 후면 버퍼를 전면 버퍼로 전환하는 방법을 이용 (그림 1.4) 두개의 표면을 가진 스왑 체인 : 전면, 후면 버퍼 화면 밖의 표면(후면 버퍼)에 렌더링을 수행 전면 버퍼 표면의 디스플레이가 완료되면 스왑 체인의 끝으로 돌아가 후면 버퍼를 전면 버퍼로 전환하는 방법을 이용 위의 과정을 시연(presenting)이라 함 전면 버퍼 이 버퍼의 내용물은 현재 모니터에서 보여지고 있는것 후면 버퍼 현재 처리중인 프레임이 이 버퍼에 보관된다. 표 면 2 표 면 1 2009-1학기 컴퓨터게임(DirectX)
- 렌더링 구조 : 1. 후면 버퍼 렌더링, 2. 후면 버퍼 시연, 3. 1번으로 돌아감 교환 (그림 1.5) 두 차례의 시연, 두개의 표면으로 구성된 스왑 체인을 이용 - 렌더링 구조 : 1. 후면 버퍼 렌더링, 2. 후면 버퍼 시연, 3. 1번으로 돌아감 표면 1 전면 버퍼 표면 2 후면 버퍼 표면 1 교환 표면 2 전면 버퍼 교환 표면 1 전면 버퍼 2009-1학기 컴퓨터게임(DirectX)
깊 이 버 퍼 깊이 버퍼(depth buffer)는 이미지가 데이터가 아닌 특정 픽셀의 깊이 정보를 포함하는 표면 깊이 버퍼 내에는 최종 렌더링 된 이미지의 각 픽셀에 해당하는 항목들을 포함 640 x 640 해상도라면 640 x 640개의 깊이 항목 존재 Direct3D는 물체의 픽셀이 다른 픽셀을 가리는지 여부를 판단하기 위해 깊이 버퍼링 혹은 z-버퍼링 테크닉을 이용 깊이 버퍼링은 각 픽셀의 깊이 값을 계산, 깊이 테스트를 수행함으로써 이루어짐 2009-1학기 컴퓨터게임(DirectX)
특정 픽셀의 위치에서 경쟁하는 픽셀의 깊이를 비교하는 과정 카메라에서 가장 가까운 위치의 픽셀이 이미지에 그려짐 특정 픽셀의 위치에서 경쟁하는 픽셀의 깊이를 비교하는 과정 카메라에서 가장 가까운 위치의 픽셀이 이미지에 그려짐 깊이 버퍼의 포맷이 깊이 테스트의 정확도를 결정. 즉, 24-비트 깊이 버퍼는 16-비트 깊이 버퍼에 비해 더욱 정확하다. D3DFMT_D32 : 32비트 깊이버퍼 지정 D3DFMT_D24S8 : 24 깊이버퍼,8비트 스텐실버퍼 예약 D3DFMT_D24X8 : 24비트 깊이버퍼 지정 D3DFMT_D24X4S4 : 24비트 깊이버퍼, 4비트 스텐실 D3DFMT_D16 : 16비트 깊이버퍼 지정 2009-1학기 컴퓨터게임(DirectX)
버텍스 프로세싱 버텍스는 3D 기하물체를 구성하는 기본 단위 소프트웨어나 하드웨어의 두 가지 방법으로 처리 소프트웨어 버텍스 프로세싱 언제나 지원, 항상 이용 가능 하드웨어 버텍스 프로세싱 그래픽 카드가 지원하는 경우에만 이용가능 소프트웨어에 비해 전용 하드웨어의 성능이 우수하므로 하드웨어 버텍스 프로세싱을 이용하는 것이 유리 2009-1학기 컴퓨터게임(DirectX)
장 치 특 성 Direct3D가 제공하는 모든 기능들은 D3DCAPS9 구조체 내의 비트와 데이터 멤버에 대응됨 기본 방식 2009-1학기 컴퓨터게임(DirectX)
bool supportsHardware; 이 방식을 이용하는 방법: D3DCAPS9 인스턴스의 대응되는 비트나 데이터멤버를 확인하여 장치가 특정한 기능을 제공하는지 확인 bool supportsHardware; If( caps.DevCaps & D3DEVCAPS_HWTRANSFORMANDLIGHT) supportsHardware = true; else supportsHardware = false; DevCaps는 장치 특성(Device Capabilities)의 의미를 가짐 D3DEVCAPS_HWTRANSFORMANDLIGHT 비트 장치가 변환과 조명 계산을 하드웨어적으로 처리할 수 있는지 여부를 알려줌 2009-1학기 컴퓨터게임(DirectX)
Direct3D 초기화 하기 초기화 과정 1) IDirect3D9 인터페이스로의 포인터를 얻는다. 시스템의 물리적 하드웨어 장치에 대한 정보 얻음 3D 그래픽을 디스플레이 하는 데 이용하는 IDirect3DDevice9 인터페이스를 만드는데 이용 2) 디스플레이 어댑터(그래픽 카드)가 하드웨어 버텍스 프로세싱을 지원하는지 알아보기 위해 장치 특성을 확인 IDirect3DDevice9 인터페이스를 만들기 위해 하드웨어 지원 여부 확인 3) D3DPRESENT_PARAMETERS 구조체 인스턴스 초기화. 이 구조체는 IDirect3DDevice9 인스턴스의 특성을 지정하기 위한 몇 가지 데이터 멤버 포함 4) 초기화된 D3DPRESENT_PARAMETERS에 따라 IDirect3DDevice9 객체를 만들어 냄 2009-1학기 컴퓨터게임(DirectX)
1) IDirect4D9 인터페이스 얻기 IDirect3D9 * _d3d9; _d3d9 = Direct3DCreate9(D3D_SDK_VERSION); Direct3DCreate9의 단일 인자에는 항상 D3D_SDK_VERSION을 전달해야 함 IDirect3D9 객체 장치 검증 기능, 디스플레이 모드, 포맷 등과 같이 시스템의 그래픽 장치가 제공하는 특성에 대한 정보를 얻는 과정 IDirect3DDevice9 객체 생성의 두 가지 용도로 쓰임. 2009-1학기 컴퓨터게임(DirectX)
2) 하드웨어 버텍스 프로세싱 확인하기 기본 디스플레이 어댑터와 대응되는 IDirect3DDevice9 객체를 생성할 때는 반드시 원하는 버텍스 프로세싱 모드를 지정해야 함 먼저 카드에서 하드웨어 버텍스 프로세싱을 지원하는지 여부를 확인해야 함 기본 디스플레이 어댑터의 특성에 따라 D3DCAPS9 인스턴스를 초기화해야 함 HRESULT IDirect3D9::GetDeviceCaps (UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9 *pCaps); 위의 코드(함수)를 이용 2009-1학기 컴퓨터게임(DirectX)
Adapter : 특성을 얻고자 하는 물리 디스플레이 어댑터 DeviceType : 이용할 장치 타입 지정 하드웨어 장치 (D3DDEVTYPE_HAL) 소프트웨어 장치(D3DDEVTYPE_REF) pCaps : 초기화된 특성 구조체를 리턴 2009-1학기 컴퓨터게임(DirectX)
예제 코드 // 기본 디스플레이 어댑터의 특성으로 D3DCAPS 구조체를 채운다. D3DCAPS9 caps; d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps); // 기본 디스플레이 어댑터 표기, 장치 타입 지정, // D3DCAPS9 구초제를 리턴 int vp = 0; // 하드웨어 버텍스 프로세싱 사용 가능한지 여부 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; // 하드웨어 버텍스 프로세싱 지원 사실을 vp 에 저장 else 2009-1학기 컴퓨터게임(DirectX)
vp : 이후 IDirect3DDevice9 객체를 만들 때 버텍스 프로세싱의 타입을 지정해야 하기 때문에 사용 vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // 소프트웨어 버텍스 프로세싱을 이용해야 함을 저장 vp : 이후 IDirect3DDevice9 객체를 만들 때 버텍스 프로세싱의 타입을 지정해야 하기 때문에 사용 2009-1학기 컴퓨터게임(DirectX)
3) D3DPRESENT_PARAMETERS 구조체 채우기 만들고자 하는 IDirect3DDevice9 객체의 성격을 결정하는데 이용 typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWidndow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT PresentationInterval; } D3DPRESENT_PARAMETERS; 2009-1학기 컴퓨터게임(DirectX)
D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth = width; // 픽셀 단위의 후면 버퍼 너비 d3dpp.BackBufferHeight = height; // 픽셀 단위의 후면 버퍼 높이 d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; // 후면 버퍼의 픽셀 포맷 d3dpp.BackBufferCount = 1; // 이용할 후면 버퍼의 수 d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; // 후면 버퍼에 이용할 멀티 샘플링 타입 d3dpp.MultiSampleQuality = 0; // 멀티 샘플링의 레벨 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //플리핑 체인의 버퍼 교환방법 지정 d3dpp.hDeviceWindow = hwnd; //서비스와 연결된 윈도우 핸들 2009-1학기 컴퓨터게임(DirectX)
d3dpp.Windowed = windowed; // 윈도우 모드로 실행 중일 때는 true, 전체화면 모드는 false 지정 d3dpp.EnableAutoDepthStencil = true; // 자동으로 깊이, 스텐실 버퍼 실행은 true d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // 깊이 스텐실 버퍼 포멧 d3dpp.Flags = 0; //몇 가지 부가적인 특성들 지정 // 0 을 지정하거나 D3DPRESENTFLAG 집합의 멤버 중 하나 지정 d3dpp.FullScreen_RefreshRateInHz = DPRESENT_RATE_DEFAULT; // 재생율을 지정한다. d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // D3DPRESENT 집합의 멤버 2009-1학기 컴퓨터게임(DirectX)
4) IDirect3DDevice9 인터페이스 만들기 D3DPRESENT_PARAMETERS를 채운 뒤에는 다음의 메서드를 이용해 IDirect3DDevice9 객체를 만들 수 있다. HRESULT IDirect3D9::CreateDevice (UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD Behaviorflags, D3DPRESENT_PARAMETERS * pPresentationPrarameters, IDirect3DDevice9 ** ppReturnedDeviceInterface); 2009-1학기 컴퓨터게임(DirectX)
Adapter : 만들어질 IDirect3DDevice9 객체와 대응될 물리 디스플레이 어댑터 지정 DeviceType : 이용할 장치 타입 지정(하드웨어 장치(D3DDEVTYPE_HAL), 혹은 소프트웨어 장치(D3DDEVTYPE_REF)) hFocusWindow : 장치와 연결될 윈도우 핸들 Behaviorflags : D3DCREATE_HARDWARE_VERTEXPROCESSING 이나 D3DCREATE _SOFTWARE_VERTEXTPROCESSING 지정 pPresentationParameters : 장치 특성의 일부를 정의하는 초기화된 D3DPRESENT_PARAMETERS 인스턴스 지정 ppReturnedDeviceInterface : 생성된 장치를 리턴 2009-1학기 컴퓨터게임(DirectX)
IDirect3DDevice9* device = 0; hr = d3d9->CreateDevice( 사용 예) IDirect3DDevice9* device = 0; hr = d3d9->CreateDevice( D3DADAPTER_DEFAULT, // 기본 어뎁터 D3DDEVTYPE_HAL, // 장치 타입 hwnd, // 장치와 연결될 윈도우 vp, // 버텍스 프로세싱 타입 &d3dpp, // 시연 인자 device); // 생성된 장치 if( FAILED(hr) ) { d3d9->Release(); // done with d3d9 object ::MessageBox(0, "CreateDevice() - FAILED", 0, 0); return false; } 2009-1학기 컴퓨터게임(DirectX)
예제 애플리케이션 : Direct3D 초기화 d3dUtility.h 와 d3dUtility.cpp 2009-1학기 컴퓨터게임(DirectX)
#include <d3dx9.h> #include <string> namespace d3d { d3dUtility.h #include <d3dx9.h> #include <string> namespace d3d { bool InitD3D( HINSTANCE hInstance, // [입력] App 인스턴스. int width, int height, // [입력] 후면 버퍼 크기. bool windowed, // [입력] 윈도우(true)혹은 전체화면(false). D3DDEVTYPE deviceType, // [입력] HAL or REF IDirect3DDevice9** device);// [출력] 만들어진 장치 int EnterMsgLoop( bool (*ptr_display)(float timeDelta)); 2009-1학기 컴퓨터게임(DirectX)
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); template<class T> void Release(T t) { if( t ){ t->Release(); t = 0; } template<class T> void Delete(T t) delete t; 2009-1학기 컴퓨터게임(DirectX)
메시지 루프 함수는 유휴 상태에서 디스플레이 함수를 호출하여 드로잉 수행 InitD3D 메인 어플리케이션 윈도우를 초기화 1.4에서 설명한 Direct3D 초기화 코드 구현 EnterMsgLoop 어플리케이션의 메시지 루프를 포장 디스플레이 함수가 될 함수의 포인터를 받음 디스플레이 함수는 드로잉 코드 구현할 함수 메시지 루프 함수는 유휴 상태에서 디스플레이 함수를 호출하여 드로잉 수행 2009-1학기 컴퓨터게임(DirectX)
COM 인터페이스 해제하고 null로 지정하는 템플릿 Delete 저장고의 객체 제거, 포인터를 null로 지정하는 템플릿 Release COM 인터페이스 해제하고 null로 지정하는 템플릿 Delete 저장고의 객체 제거, 포인터를 null로 지정하는 템플릿 WndProc 메인 App 윈도우를 위한 윈도우 프로시저의 선언 2009-1학기 컴퓨터게임(DirectX)
예제 프레임 웍 예제 프레임웍이란 책의 예제 어플리케이션을 작성할 때 이용할 일반적인 구조를 말함 다음 세 가지 공통적인 함수를 포함 bool Setup() 자원의 할당이나 장치 특성의 확인, 어플리케이션 상태 설정 등과 같이 사전 준비 작업 void Cleanup() Setup함수에서 할당된 자원을 해제하는 작업 bool Display(float timeDelta) 모든 드로잉 코드를 구현 물체의 위치를 수정하는 등의 매 프레임 마다 일어나야 하는 작업 수행 timeDelta 인자는 각 프레임의 경과 시간이며 초당 프레임과의 애니메이션 동기화에 이용된다. 2009-1학기 컴퓨터게임(DirectX)
예제 : D3DInit #include "d3dUtility.h“ IDirect3DDevice9* Device = 0; // 장치를 위한 전역변수를 인스턴스화 bool Setup(){ // 프레임웍 함수 구현 return true; } void Cleanup() // 이 예제에서는 자원 할당이 필요없으므로 {} // Setup 과 Cleanup 메서드가 비어 있음 bool Display(float timeDelta) { // 후면버퍼를 소거하고 깊이/스텐실 버퍼를 각각 // 검은색과 1.0으로 초기화하는 IDirect3DDevice::Clear // 메서드 호출 if( Device ) { Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); Device->Present(0, 0, 0, 0); } return true; 2009-1학기 컴퓨터게임(DirectX)
// 윈도우 프로시저 메서드: 몇 가지 이벤트를 처리, // Esc 를 눌러 어플케이션을 종료할 수 있게 한다. LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) case WM_DESTROY: ::PostQuitMessage(0); break; case WM_KEYDOWN: if( wParam == VK_ESCAPE ) ::DestroyWindow(hwnd); } return ::DefWindowProc(hwnd, msg, wParam, lParam); 2009-1학기 컴퓨터게임(DirectX)
메인 디스플레이 윈도우와 Direct3D 초기화 Setup 함수를 호출하여 어플리케이션 사전 준비를 수행 WinMain 은 다음 단계 수행 메인 디스플레이 윈도우와 Direct3D 초기화 Setup 함수를 호출하여 어플리케이션 사전 준비를 수행 Display를 디스플레이 함수로 이용하여 메시지 루프에 진입 어플리케이션을 정리하고 최종적으로 IDirect3DDevice9 객체를 해제 2009-1학기 컴퓨터게임(DirectX)
if(!d3d::InitD3D(hinstance,640, 480, true, D3DDEVTYPE_HAL, &Device)) int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd) { if(!d3d::InitD3D(hinstance,640, 480, true, D3DDEVTYPE_HAL, &Device)) ::MessageBox(0, "InitD3D() - FAILED", 0, 0); return 0; } if(!Setup()) { ::MessageBox(0, "Setup() - FAILED", 0, 0); d3d::EnterMsgLoop( Display ); Cleanup(); Device->Release(); 2009-1학기 컴퓨터게임(DirectX)
예제를 컴파일 하기 위해서는 d3d9.lib, d3dx9.lib, winmm.lib를 링크해야한다. 2009-1학기 컴퓨터게임(DirectX)
2009-1학기 컴퓨터게임(DirectX)