DirectX9:基础篇 第一章 初始化Direct3D
一.簡介
二.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)體,不僅可以用來獲取設(shè)備類型還可以用來判斷是否支持硬件加速
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; //后臺緩沖區(qū)寬度
UINT BackBufferHeight; //后臺緩沖區(qū)高度
D3DFORMAT BackBufferFormat; //后臺緩沖區(qū)像素格式
UINT BackBufferCount; //后臺緩沖區(qū)數(shù)量
D3DMULTISAMPLE_TYPE MultiSampleType; //多重采樣類型
DWORD MultiSampleQuality; //多重采樣質(zhì)量
D3DSWAPEFFECT SwapEffect; //緩沖區(qū)的交換方式
//Direct3D用交換鏈來交替兩幀之間的過渡,用IDirect3DSwapChain接口來表示
HWND hDeviceWindow; //窗口句柄
BOOL Windowed; //全屏或者窗口
BOOL EnableAutoDepthStencil; //是否開啟深度緩存和模板緩存
//深度緩存是一個表面,擔(dān)不是存儲圖像數(shù)據(jù)而是用來記錄像素深度信息,用來確定物體的前后關(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:默認
D3DFMT_R8G8B8:表示24為像素
D3DFMT_X8R8G8B8:表示一個32為像素
Multisampling
D3DMULTISAMPLE_NONE:不使用全屏抗鋸齒
D3DMULTISAMPLE_1_SAMPLE - D3DMULTISAMPLE_16_SAMPLE:設(shè)定1-16級
SwapEffect
D3DSWAPEEFECT_COPY :swap時,拷貝后緩沖區(qū)的內(nèi)容到前緩沖區(qū),后緩沖區(qū)的內(nèi)容不變。
D3DSWAPEEFECT_FLIP :swap時,交換前后緩沖區(qū)指針,完成翻頁,之后后緩沖區(qū)的內(nèi)容是前緩沖區(qū)的內(nèi)容
D3DSWAPEEFECT_DISCARD:可能是COPY也可能是FLIP,由設(shè)備來確定最適合當(dāng)前情況的方式。
D3DSWAPEFFECT_DISCARD:清除后臺緩存的內(nèi)容
D3DSWAPEEFECT_FLIP:保留后臺緩存的內(nèi)容。當(dāng)緩存區(qū)>1時。
D3DSWAPEFFECT_COPY: 保留后臺緩存的內(nèi)容,緩沖區(qū)=1時。
AutoDepthStencilFormat
D3DFMT_D32:指定一個32位的深度緩沖區(qū)
D3DFMT_D24S8:指定一個32位的深度/模板緩沖區(qū),其中24位用于深度緩沖區(qū),8位用于模板緩沖區(qū)
D3DFMT_D24X8:指定一個32位的深度/模板緩沖區(qū),其中24位用于的度緩沖區(qū),8位空閑
D3DFMT_D24X4S4:指定一個32位的深度/模板緩沖區(qū),其中24位用于深度緩沖區(qū),4位用于模板緩沖區(qū),4位空閑
D3DFMT_D16:指定一個16位的深度緩存區(qū)
D3DFMT_D15S1:指定一個16位的深度/模板緩沖區(qū),其中15位用于深度緩沖區(qū),1位用于模板緩沖區(qū)
Flags
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER:表示后緩沖區(qū)可以被鎖定,需要注意的是這樣緩沖區(qū)會降低程序的運行效率。
D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL:指定深度緩沖區(qū)和模板緩沖區(qū)在后一個緩沖區(qū)被渲染(即調(diào)用Present方法后)的時候?qū)⒈会尫?/p>
FullScreen_RefreshRateInHz
在窗口模式下,必須指定為0或D3DPRESENT_RATE_DEFAULT(即默認的),表示使用與當(dāng)前屏幕相同的刷新率)
D3DPRESENT_RATE_DEFAULT:表示使用默認刷新率,即與屏幕刷新率相同。
D3DPRESENT_RATE_UNLIMITED:表示圖形繪制結(jié)束后立刻將內(nèi)容復(fù)制到前臺緩沖區(qū)。
PresentationInterval
在窗口模式下,其取值為0,只能選用D3DPRESENT_INTERVAL_DEFAULT
D3DPRESENT_INTERVAL_DEFAULT:D3D選擇交換頻率,通常等同于屏幕刷新率
D3DPRESENT_INTERVAL_IMMEDIATE:立即顯示更新(或立即交換),不推薦
D3DPRESENT_INTERVAL_ONE:等待一個垂直掃描周期才更新,有助于減少剪斷和撕裂效果(其實DEFAULT和ONE完全無區(qū)別)
D3DPRESENT_INTERVAL_TWO~FOUR:分別對應(yīng)等待相應(yīng)個數(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, //默認顯示適配器(顯卡)
D3DDEVTYPE DeviceType, //設(shè)備類型
HWND hFocusWindow, //窗口句柄
DWORD BehaviorFlags, //是否支持硬件頂點處理的枚舉值
D3DPRESENT_PARAMETERS *pPresentationParameters, //顯示參數(shù)結(jié)構(gòu)體
IDirect3DDevice9** ppReturnedDeviceInterface //要創(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;
}
三.簡化版示例
因為完整版代碼比較多理解有點難,所以有些不必要的可以去掉,這樣我們寫些例子的時候,也可以精簡一些
我們用一個.cpp和一個.hpp就可以實現(xiàn)了,它把窗口的創(chuàng)建和顯示圖像隔離開
1.d3dInit_k5.cpp
#include "d3dInit_k5.hpp"
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
//函數(shù)開始
int WINAPI/*基本調(diào)用_stdcall*/ WinMain(HINSTANCE hInstance,/*當(dāng)前運行程序的實例句柄*/
HINSTANCE hPrevInstance,/*前一個句柄,一般都是NULL*/
LPSTR lpCmdLine,/*命令行參數(shù),以空終止的字符串*/
int nCmdShow /*顯示方式*/)
{
//聲明一個窗口類結(jié)構(gòu)體
WNDCLASS wc = { 0 }; //WNDCLASSEX比WNDCLASS多兩個參數(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; //指定包含窗口過程的程序的實例句柄
wc.hIcon = LoadIcon(0,/*程序句柄加載系統(tǒng)圖標(biāo)第一個參數(shù)為NULL,加載用戶圖標(biāo)第一個參數(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",//對應(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ì)量等級
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//指定表面在交換鏈中是如何被交換
d3dpp.hDeviceWindow = hwnd;//與設(shè)備相關(guān)的窗口句柄,想在哪個窗口繪制就寫那個窗口的句柄
d3dpp.Windowed = true;//true為窗口模式,false則為全屏模式
d3dpp.EnableAutoDepthStencil = true;//設(shè)為true,D3D將自動創(chuàng)建深度/模板緩沖
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;//深度/模板緩沖的格式
d3dpp.Flags = 0; //一些附加特性,設(shè)為0或者D3DPRESENTFLAG類型的一個成員,一個表面能夠被鎖定,降低程序的性能,一個深度/模板緩沖調(diào)用present后會被刪除,提升程序性能
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;//刷新頻率
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;//交換方式(D3DPRESENT_INTERVAL_IMMEDIATE立即交換,D3DPRESENT_INTERVAL_DEFAULT 等于刷新頻率)
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // 指定對象要表示的物理顯示設(shè)備
deviceType, // 設(shè)備類型
hwnd, // 設(shè)備的窗口句柄
vp, // 采用硬件頂點處理或者軟件頂點處理
&d3dpp, // 初始化好的D3DPRESENT_PARAMETERS實例
&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{
//開始設(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);
//開始顯示
Device->Present(0, 0, 0, 0);
}
總結(jié)
以上是生活随笔為你收集整理的DirectX9:基础篇 第一章 初始化Direct3D的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SEP11备份与灾难恢复-官方文档
- 下一篇: 为自己配置YUM服务器