日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

DirectX9:基础篇 第一章 初始化Direct3D

發(fā)布時(shí)間:2023/12/31 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 DirectX9:基础篇 第一章 初始化Direct3D 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.簡(jiǎn)介

二.Direct3D類

1.創(chuàng)建D3D類

IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion);

//Direct3D類的創(chuàng)建
 
IDirect3D9* d3d9=0;
d3d9=Direct3DCreate9(D3D_SDK_VERSION);

2.獲取設(shè)備類型

STDMETHOD(GetDeviceCaps)(

THIS_ UINT Adapter, //設(shè)備顯示器(顯卡)

D3DDEVTYPE DeviceType, //要獲取的設(shè)備類型

D3DCAPS9* pCaps //要獲取的設(shè)備參數(shù)

) PURE;

Adapter

    D3DADAPTER_DEFAULT

DeviceType

    D3DDEVTYPE_HAL

    D3DDEVTYPE_REF

D3DCAPS9 caps;
D3DDEVTYPE deviceType;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

3.判斷顯卡是否支持硬件加速

D3DCAPS9是設(shè)備參數(shù)結(jié)構(gòu)體,不僅可以用來(lái)獲取設(shè)備類型還可以用來(lái)判斷是否支持硬件加速

int vp=0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
    vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
    vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;

4.填充顯示參數(shù)結(jié)構(gòu)體

typedef struct _D3DPRESENT_PARAMETERS_{

UINT BackBufferWidth; //后臺(tái)緩沖區(qū)寬度

UINT BackBufferHeight; //后臺(tái)緩沖區(qū)高度

D3DFORMAT BackBufferFormat; //后臺(tái)緩沖區(qū)像素格式

UINT BackBufferCount; //后臺(tái)緩沖區(qū)數(shù)量

D3DMULTISAMPLE_TYPE MultiSampleType; //多重采樣類型

DWORD MultiSampleQuality; //多重采樣質(zhì)量

D3DSWAPEFFECT SwapEffect; //緩沖區(qū)的交換方式

//Direct3D用交換鏈來(lái)交替兩幀之間的過(guò)渡,用IDirect3DSwapChain接口來(lái)表示

HWND hDeviceWindow; //窗口句柄

BOOL Windowed; //全屏或者窗口

BOOL EnableAutoDepthStencil; //是否開(kāi)啟深度緩存和模板緩存

//深度緩存是一個(gè)表面,擔(dān)不是存儲(chǔ)圖像數(shù)據(jù)而是用來(lái)記錄像素深度信息,用來(lái)確定物體的前后關(guān)系正確繪制的z-buffering技術(shù)

D3DFORMAT AutoDepthStencilFormat; //指定深度緩沖及模板緩沖區(qū)的格式

DWORD Flags; //其他的附加特性標(biāo)志(通常指定為0或NULL)

UINT FullScreen_RefreshRateInHz; //指定屏幕的刷新頻率

UINT PresentationInterval; //指定屏幕的翻轉(zhuǎn)模式

}D3DPRESENT_PARAMETERS;

BackBufferFormat

    D3DFMT_UNKOWN:默認(rèn)

    D3DFMT_R8G8B8:表示24為像素

    D3DFMT_X8R8G8B8:表示一個(gè)32為像素

Multisampling

    D3DMULTISAMPLE_NONE:不使用全屏抗鋸齒

    D3DMULTISAMPLE_1_SAMPLE - D3DMULTISAMPLE_16_SAMPLE:設(shè)定1-16級(jí)

SwapEffect

    D3DSWAPEEFECT_COPY :swap時(shí),拷貝后緩沖區(qū)的內(nèi)容到前緩沖區(qū),后緩沖區(qū)的內(nèi)容不變。

    D3DSWAPEEFECT_FLIP :swap時(shí),交換前后緩沖區(qū)指針,完成翻頁(yè),之后后緩沖區(qū)的內(nèi)容是前緩沖區(qū)的內(nèi)容

    D3DSWAPEEFECT_DISCARD:可能是COPY也可能是FLIP,由設(shè)備來(lái)確定最適合當(dāng)前情況的方式。

    D3DSWAPEFFECT_DISCARD:清除后臺(tái)緩存的內(nèi)容

    D3DSWAPEEFECT_FLIP:保留后臺(tái)緩存的內(nèi)容。當(dāng)緩存區(qū)>1時(shí)。

    D3DSWAPEFFECT_COPY: 保留后臺(tái)緩存的內(nèi)容,緩沖區(qū)=1時(shí)。

AutoDepthStencilFormat

    D3DFMT_D32:指定一個(gè)32位的深度緩沖區(qū)

    D3DFMT_D24S8:指定一個(gè)32位的深度/模板緩沖區(qū),其中24位用于深度緩沖區(qū),8位用于模板緩沖區(qū)

    D3DFMT_D24X8:指定一個(gè)32位的深度/模板緩沖區(qū),其中24位用于的度緩沖區(qū),8位空閑

    D3DFMT_D24X4S4:指定一個(gè)32位的深度/模板緩沖區(qū),其中24位用于深度緩沖區(qū),4位用于模板緩沖區(qū),4位空閑

    D3DFMT_D16:指定一個(gè)16位的深度緩存區(qū)

    D3DFMT_D15S1:指定一個(gè)16位的深度/模板緩沖區(qū),其中15位用于深度緩沖區(qū),1位用于模板緩沖區(qū)

Flags

    D3DPRESENTFLAG_LOCKABLE_BACKBUFFER:表示后緩沖區(qū)可以被鎖定,需要注意的是這樣緩沖區(qū)會(huì)降低程序的運(yùn)行效率。

    D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL:指定深度緩沖區(qū)和模板緩沖區(qū)在后一個(gè)緩沖區(qū)被渲染(即調(diào)用Present方法后)的時(shí)候?qū)⒈会尫?/p>

FullScreen_RefreshRateInHz

    在窗口模式下,必須指定為0或D3DPRESENT_RATE_DEFAULT(即默認(rèn)的),表示使用與當(dāng)前屏幕相同的刷新率)

    D3DPRESENT_RATE_DEFAULT:表示使用默認(rèn)刷新率,即與屏幕刷新率相同。

    D3DPRESENT_RATE_UNLIMITED:表示圖形繪制結(jié)束后立刻將內(nèi)容復(fù)制到前臺(tái)緩沖區(qū)。

PresentationInterval

    在窗口模式下,其取值為0,只能選用D3DPRESENT_INTERVAL_DEFAULT

    D3DPRESENT_INTERVAL_DEFAULT:D3D選擇交換頻率,通常等同于屏幕刷新率

    D3DPRESENT_INTERVAL_IMMEDIATE:立即顯示更新(或立即交換),不推薦

    D3DPRESENT_INTERVAL_ONE:等待一個(gè)垂直掃描周期才更新,有助于減少剪斷和撕裂效果(其實(shí)DEFAULT和ONE完全無(wú)區(qū)別)

    D3DPRESENT_INTERVAL_TWO~FOUR:分別對(duì)應(yīng)等待相應(yīng)個(gè)數(shù)周期才更新

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;
d3dpp.Windowed                   = windowed;
d3dpp.EnableAutoDepthStencil     = true; 
d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
d3dpp.Flags                      = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

5.創(chuàng)建D3D設(shè)備類

HRESULT CreateDevice(

UINT Adapter, //默認(rèn)顯示適配器(顯卡)

D3DDEVTYPE DeviceType, //設(shè)備類型

HWND hFocusWindow, //窗口句柄

DWORD BehaviorFlags, //是否支持硬件頂點(diǎn)處理的枚舉值

D3DPRESENT_PARAMETERS *pPresentationParameters, //顯示參數(shù)結(jié)構(gòu)體

IDirect3DDevice9** ppReturnedDeviceInterface //要?jiǎng)?chuàng)建的D3D設(shè)備類

);

//Direct3D設(shè)備類的創(chuàng)建
 
IDirect3DDevice9* Device=0;
HRESULT hr=d3d9->CreateDevice(
    D3DADAPTER_DEFAULT,
    deviceType,
    hwnd,
    vp,
    &d3dpp,
    device);

五.完整版示例

1.d3dUntility.h

//////////////////////////////////////////////////////////////////////////////////////////////////
// 
// File: d3dUtility.h
// 
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0 
//
// Desc: Provides utility functions for simplifying common tasks.
//          
//////////////////////////////////////////////////////////////////////////////////////////////////
 
#ifndef __d3dUtilityH__
#define __d3dUtilityH__
 
#include <d3dx9.h>
#include <string>
#include <tchar.h>
 
#pragma comment(lib,"d3d9.lib") 
#pragma comment(lib,"winmm.lib") 
#pragma comment(lib,"d3dx9.lib")
 
 
 
namespace d3d
{
	bool InitD3D(
		HINSTANCE hInstance,       // [in] Application instance.
		int width, int height,     // [in] Backbuffer dimensions.
		bool windowed,             // [in] Windowed (true)or full screen (false).
		D3DDEVTYPE deviceType,     // [in] HAL or REF
		IDirect3DDevice9** device);// [out]The created device.
 
	int EnterMsgLoop( 
		bool (*ptr_display)(float timeDelta));
 
	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)
	{
		if( t )
		{
			delete t;
			t = 0;
		}
	}
}
 
#endif // __d3dUtilityH__

2.d3dUntility.cpp

//////////////////////////////////////////////////////////////////////////////////////////////////
// 
// File: d3dUtility.cpp
// 
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0 
//
// Desc: Provides utility functions for simplifying common tasks.
//          
//////////////////////////////////////////////////////////////////////////////////////////////////
 
#include "d3dUnitility.h"
 
bool d3d::InitD3D(
	HINSTANCE hInstance,
	int width, int height,
	bool windowed,
	D3DDEVTYPE deviceType,
	IDirect3DDevice9** device)
{
	//
	// Create the main application window.
	//
 
	WNDCLASS wc;
 
	wc.style         = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc   = (WNDPROC)d3d::WndProc; 
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hInstance;
	wc.hIcon         = LoadIcon(0, IDI_APPLICATION);
	wc.hCursor       = LoadCursor(0, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = 0;
	wc.lpszClassName = _T("Direct3D9App");
 
	if( !RegisterClass(&wc) ) 
	{
		::MessageBoxA(0, "RegisterClass() - FAILED", 0, 0);
		return false;
	}
 
	HWND hwnd = 0;
	hwnd = ::CreateWindow(_T("Direct3D9App"), _T("Direct3D9App"), 
		WS_EX_TOPMOST,
		0, 0, width, height,
		0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/); 
 
	if( !hwnd )
	{
		::MessageBoxA(0, "CreateWindow() - FAILED", 0, 0);
		return false;
	}
 
	::ShowWindow(hwnd, SW_SHOW);
	::UpdateWindow(hwnd);
 
	//
	// Init D3D: 
	//
 
	HRESULT hr = 0;
 
	// Step 1: Create the IDirect3D9 object.
 
	IDirect3D9* d3d9 = 0;
	d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
 
	if( !d3d9 )
	{
		::MessageBoxA(0, "Direct3DCreate9() - FAILED", 0, 0);
		return false;
	}
 
	// Step 2: Check for hardware vp.
 
	D3DCAPS9 caps;
	d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
 
	int vp = 0;
	if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
	else
		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
 
	// Step 3: Fill out the D3DPRESENT_PARAMETERS structure.
 
	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;
	d3dpp.Windowed                   = windowed;
	d3dpp.EnableAutoDepthStencil     = true; 
	d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
	d3dpp.Flags                      = 0;
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
	d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;
 
	// Step 4: Create the device.
 
	hr = d3d9->CreateDevice(
		D3DADAPTER_DEFAULT, // primary adapter
		deviceType,         // device type
		hwnd,               // window associated with device
		vp,                 // vertex processing
		&d3dpp,             // present parameters
		device);            // return created device
 
	if( FAILED(hr) )
	{
		// try again using a 16-bit depth buffer
		d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
 
		hr = d3d9->CreateDevice(
			D3DADAPTER_DEFAULT,
			deviceType,
			hwnd,
			vp,
			&d3dpp,
			device);
 
		if( FAILED(hr) )
		{
			d3d9->Release(); // done with d3d9 object
			::MessageBoxA(0, "CreateDevice() - FAILED", 0, 0);
			return false;
		}
	}
 
	d3d9->Release(); // done with d3d9 object
 
	return true;
}
 
int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) )
{
	MSG msg;
	::ZeroMemory(&msg, sizeof(MSG));
 
	static float lastTime = (float)timeGetTime(); 
 
	while(msg.message != WM_QUIT)
	{
		if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			::TranslateMessage(&msg);
			::DispatchMessage(&msg);
		}
		else
		{	
			float currTime  = (float)timeGetTime();
			float timeDelta = (currTime - lastTime)*0.001f;
 
			ptr_display(timeDelta);
 
			lastTime = currTime;
		}
	}
	return msg.wParam;
}
 
 

3.d3dInit.cpp

//////////////////////////////////////////////////////////////////////////////////////////////////
// 
// File: d3dinit.cpp
// 
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0 
//
// Desc: Demonstrates how to initialize Direct3D, how to use the book's framework
//       functions, and how to clear the screen to black.  Note that the Direct3D
//       initialization code is in the d3dUtility.h/.cpp files.
//          
//////////////////////////////////////////////////////////////////////////////////////////////////
 
#include "d3dUnitility.h"
#include <windows.h>
 
//
// Globals
//
 
IDirect3DDevice9* Device = 0; 
 
//
// Framework Functions
//
 
bool Setup()
{
	// Nothing to setup in this sample.
 
	return true;
}
 
void Cleanup()
{
	// Nothing to cleanup in this sample.
}
 
bool Display(float timeDelta)
{
	if( Device ) // Only use Device methods if we have a valid device.
	{
		// Instruct the device to set each pixel on the back buffer black -
		// D3DCLEAR_TARGET: 0x00000000 (black) - and to set each pixel on
		// the depth buffer to a value of 1.0 - D3DCLEAR_ZBUFFER: 1.0f.
		Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
 
		// Swap the back and front buffers.
		Device->Present(0, 0, 0, 0);
	}
	return true;
}
 
//
// WndProc
//
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);
		break;
	}
	return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
 
//
// WinMain
//
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);
		return 0;
	}
 
	d3d::EnterMsgLoop( Display );
 
	Cleanup();
 
	Device->Release();
 
	return 0;
}

三.簡(jiǎn)化版示例

因?yàn)橥暾娲a比較多理解有點(diǎn)難,所以有些不必要的可以去掉,這樣我們寫些例子的時(shí)候,也可以精簡(jiǎn)一些

我們用一個(gè).cpp和一個(gè).hpp就可以實(shí)現(xiàn)了,它把窗口的創(chuàng)建和顯示圖像隔離開(kāi)

1.d3dInit_k5.cpp

#include "d3dInit_k5.hpp"
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
//函數(shù)開(kāi)始
 
int WINAPI/*基本調(diào)用_stdcall*/ WinMain(HINSTANCE hInstance,/*當(dāng)前運(yùn)行程序的實(shí)例句柄*/
	HINSTANCE hPrevInstance,/*前一個(gè)句柄,一般都是NULL*/
	LPSTR lpCmdLine,/*命令行參數(shù),以空終止的字符串*/
	int nCmdShow /*顯示方式*/)
{
	//聲明一個(gè)窗口類結(jié)構(gòu)體
	WNDCLASS wc = { 0 }; //WNDCLASSEX比WNDCLASS多兩個(gè)參數(shù)
	//wc.cbSize = sizeof(PWNDCLASSEX);//表示該結(jié)構(gòu)體的字節(jié)數(shù)大小
	wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口的風(fēng)格樣式 水平大小或垂直大小變化發(fā)生重繪
	wc.lpfnWndProc = WndProc;//窗口的回調(diào)函數(shù),響應(yīng)事件的系統(tǒng)觸發(fā)函數(shù)
	wc.cbClsExtra = 0; //窗口類附加內(nèi)存
	wc.cbWndExtra = 0; //窗口的附加內(nèi)存
	wc.hInstance = hInstance; //指定包含窗口過(guò)程的程序的實(shí)例句柄
	wc.hIcon = LoadIcon(0,/*程序句柄加載系統(tǒng)圖標(biāo)第一個(gè)參數(shù)為NULL,加載用戶圖標(biāo)第一個(gè)參數(shù)為實(shí)例句柄*/
		IDI_APPLICATION/*系統(tǒng)圖標(biāo),或用戶圖標(biāo)路徑字符串*/);//窗口類的圖標(biāo)資源句柄
	wc.hCursor = LoadCursor(0, IDC_ARROW);//箭頭光標(biāo)用法同上
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景畫刷句柄
	wc.lpszMenuName = 0; //指定菜單資源的名字,字符串形式
	wc.lpszClassName = "Direct3D9App";//自定義的窗口類名字
	//wc.hIconSm = 0;//托盤中應(yīng)用程序的小圖標(biāo)
 
	if (!RegisterClass(&wc))
	{
		::MessageBox(0, TEXT("RegisterClass() - FAILED"), 0, 0);
		return 0;
	}
 
	HWND hwnd = 0;
	hwnd = CreateWindow("Direct3D9App",//對(duì)應(yīng)窗口類的名稱
		"K5窗口",						//指定創(chuàng)建的窗口名字
		WS_MAXIMIZEBOX,				//創(chuàng)建窗口的樣式
		CW_USEDEFAULT,				//水平位置
		CW_USEDEFAULT,				//豎直位置
		width,						//寬
		height,						//高
		0							/*父窗口的句柄*/,
		0							/* 菜單資源句柄 */,
		hInstance,					//程序?qū)嵗浔?		0 /*WM_CREATE消息lParam數(shù)據(jù)指針*/);
 
	if (!hwnd)
	{
		::MessageBox(0, TEXT("CreateWindow() - FAILED"), 0, 0);
		return 0;
	}
 
	::ShowWindow(hwnd, SW_SHOW);
	::UpdateWindow(hwnd);
 
 
	Cd3d d3d;
	d3d.InitD3D(hwnd);
 
	//消息循環(huán)
	MSG msg = { 0 };
	float lastTime = (float)timeGetTime();
	while (msg.message != WM_QUIT)
	{
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			float curTime = (float)timeGetTime();
			float timeDelta = (curTime - lastTime)*0.001f;
			if (Device)
			{
				d3d.RenderD3D();
			}
			lastTime = curTime;
		}
	}
	UnregisterClass("Direct3D9App",wc.hInstance);
	return 0;
}
 
 
 
 
LRESULT CALLBACK 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);
		break;
	}
	return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

2.d3dInit_k5.hpp

#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
 
//聲明
const int width = 800;
const int height = 600;
IDirect3DDevice9* Device = 0;
D3DDEVTYPE deviceType = D3DDEVTYPE_HAL;
 
class Cd3d{
 
public:
	bool InitD3D(HWND hwnd);
	void RenderD3D();
};
 
bool Cd3d::InitD3D(HWND hwnd){
 
	//初始化DirectX
	HRESULT hr = 0;
	IDirect3D9* d3d9 = 0;
	d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
	if (!d3d9)
	{
		::MessageBox(0, TEXT("Direct3DCreate9() - FAILED"), 0, 0);
		return false;
	}
 
	D3DCAPS9 caps;
	d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
	int vp = 0;
	if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
	else
		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
 
	D3DPRESENT_PARAMETERS d3dpp;
	d3dpp.BackBufferWidth = width;//后備緩沖表面的寬度
	d3dpp.BackBufferHeight = height;//后備緩沖表面的高度
	d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;//后備緩沖表面的像素格式
	d3dpp.BackBufferCount = 1;//后備緩沖表面的數(shù)量
	d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;//全屏抗鋸齒的類型
	d3dpp.MultiSampleQuality = 0;//全屏抗鋸齒的質(zhì)量等級(jí)
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//指定表面在交換鏈中是如何被交換
	d3dpp.hDeviceWindow = hwnd;//與設(shè)備相關(guān)的窗口句柄,想在哪個(gè)窗口繪制就寫那個(gè)窗口的句柄
	d3dpp.Windowed = true;//true為窗口模式,false則為全屏模式
	d3dpp.EnableAutoDepthStencil = true;//設(shè)為true,D3D將自動(dòng)創(chuàng)建深度/模板緩沖
	d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;//深度/模板緩沖的格式
	d3dpp.Flags = 0; //一些附加特性,設(shè)為0或者D3DPRESENTFLAG類型的一個(gè)成員,一個(gè)表面能夠被鎖定,降低程序的性能,一個(gè)深度/模板緩沖調(diào)用present后會(huì)被刪除,提升程序性能
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;//刷新頻率
	d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;//交換方式(D3DPRESENT_INTERVAL_IMMEDIATE立即交換,D3DPRESENT_INTERVAL_DEFAULT 等于刷新頻率)
 
	hr = d3d9->CreateDevice(
		D3DADAPTER_DEFAULT, // 指定對(duì)象要表示的物理顯示設(shè)備
		deviceType, // 設(shè)備類型
		hwnd, // 設(shè)備的窗口句柄
		vp, // 采用硬件頂點(diǎn)處理或者軟件頂點(diǎn)處理
		&d3dpp, // 初始化好的D3DPRESENT_PARAMETERS實(shí)例
		&Device); // 返回創(chuàng)建的設(shè)備
	if (FAILED(hr))
	{
		// try again using a 16-bit depth buffer
		d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
 
		hr = d3d9->CreateDevice(
			D3DADAPTER_DEFAULT,
			deviceType,
			hwnd,
			vp,
			&d3dpp,
			&Device);
 
		if (FAILED(hr))
		{
			d3d9->Release(); // done with d3d9 object
			::MessageBox(0, TEXT("CreateDevice() - FAILED"), 0, 0);
			return 0;
		}
	}
	else{
		//開(kāi)始設(shè)置參數(shù)
	}
 
	d3d9->Release(); // done with d3d9 object
 
	return true;
}
 
void Cd3d::RenderD3D(){
 
	Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffff0000, 1.0f, 0);
	//開(kāi)始顯示
	Device->Present(0, 0, 0, 0);
}

總結(jié)

以上是生活随笔為你收集整理的DirectX9:基础篇 第一章 初始化Direct3D的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。