初始化Direct3D

时间:2023-01-12 20:43:27

1.Direct3D概述

Direct3D是一套底层图形API,借助该API,我们能够利用硬件加速功能来绘制3D场景。

初始化Direct3D

设备制造商将其产品支持的全部功能都实现到HAL中。

1.1 Direct3D提供了参考光栅设备(REF设备),它以软件运算方式完全支持Direct3D API。REF速度缓慢,在测试以外的其他环节都不适用。

1.2 D3DDEVTYPE枚举类型
   在程序中HAL设备用值D3DDEVTYPE_HAL来表示,REF设备用值D3DDEVTYPE_REF来表示。
2.COM:创建COM接口时不可以使用new关键字,使用完用Realease方法释放。COM接口都有一个前缀I。
3.预备知识

3.1.表面是Direct3D主要用于存储2D图像数据的一个像素矩阵,实际上像素数据存储在一个线性数组中。

在代码中我们用接口IDirect3DSurface9来描述表面,接口IDirect3DSurface9最重要的方法如下:LockRect()[该方法获取指向表面存储区的指针],UnlockRect(),GetDesc()[该方法通过填充结构D3DSURFACE_DESC来获取表面的描述信息]。

3.2多重采样是一种用于平滑块状图像的技术。

D3DMULTISAMPLE_TYPE枚举类型包含一系列枚举常量,用于对表面进行多重采样的级别。

使用IDirect3D9:: CheckDeviceMultiSampleType()方法检查自己的图像设备是否支持所希望的多重采样类型。

3.3像素格式 创建表面或纹理时,可以用D3DFORMAT枚举类型的枚举常量来定义。较常用的有:

D3DFMT_R8G8B8,每个像素有24位组成,8位分给红色,8位给绿色,8位给蓝色。

D3DFMT_X8R8G8B8,每个像素有32位组成,8位未用,8位红色,8位给绿色,8位给蓝色。

D3DFMT_A8R8G8B8,每个像素有32位组成,8位Alpha值,8位红色,8位绿色,8位给蓝色。
3.4内存池:表面和其他的Direct3D资源可以放在内存池中,内存池的类型可以用D3DPOOL枚举类型来定义。
D3DPOOL_DEFAULT,D3DPOOL_MANAGED,D3DPOOL_SYSTEMMEM,D3DPOOL_SCRATCH ,D3DPOOL_FORCE_DWORD
3.5交换链和页面置换
交换链:该表面集合用接口IDirect3DSwapChain9来表示。目的是让页面显示的更加流畅。
3.6深度缓存(Z-buffering)是一个只包含页面的深度信息,不包含图像数据的表面。深度缓存为每一个像素都保存了深度项。D3DFORMAT枚举其值。常用的如下:
D3DFMT_D32  指定32位的深度缓存。
D3DFMT_D24S8 32位Z-buffering,24位深度缓存,8位供模板缓存使用。
D3DFMT_D24X8 32位Z-buffering,24位深度缓存,8位未用。
D3DFMT_D24X4S4 32位Z-buffering,24位深度缓存,4位未用,4位供模板缓存使用。
3.7顶点运算 顶点是3D几何学的基本元素,在Direct3D中我们可以使用软件顶点运算或者硬件顶点运算。始终优先考虑硬件顶点运算。
3.8设备性能 Direct3D所提供的每一项性能都对应于结构D3DCAPS9中的一个数据成员或某一位。以某一硬件为基础,初始化一个D3DCAPS9类型的实例,然后和其实例相应的数据位进行比对。  D3DCAPS9::DevCaps表示设备性能。

4.Direct3D的初始化分为以下步骤:

初始化Direct3D

4.1获取IDirect3D9的指针。

IDirect3D9* d3d9 = 0;

if( NULL == (d3d9 = Direct3DCreate9(D3D_SDK_VERSION)))

{  return E_FAIL;}

4.2校验硬件顶点运算。

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;

4.3填充D3DPRESENT_PARAMETERS结构

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;

4.4创建IDirect3DDevice9接口,用CreateDevice()函数。

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) )

{

    d3d9->Release(); // done with d3d9 object

::MessageBox(0, "CreateDevice() - FAILED", 0, 0);

return false;

}

创建每个程序都需要完成一些共性任务,如创建窗口,初始化Direct3D,进入消息循环等。这些我们将其封装在了d3dUtility.h和d3dUtility.cpp文件中。如下为具体代码,项目需加入库文件d3dx9.lib;d3d9.lib;winmm.lib;

#ifndef __d3dUtilityH__
#define __d3dUtilityH__ #include <d3dx9.h>
#include <string> 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 = ;
}
} template<class T> void Delete(T t)
{
if( t )
{
delete t;
t = ;
}
}
} #endif // __d3dUtilityH__

d3dUnility.h

#include "d3dUtility.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 = ;
wc.cbWndExtra = ;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(, IDI_APPLICATION);
wc.hCursor = LoadCursor(, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = ;
wc.lpszClassName = "Direct3D9App"; if( !RegisterClass(&wc) )
{
::MessageBox(, "RegisterClass() - FAILED", , );
return false;
} HWND hwnd = ;
hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",
WS_EX_TOPMOST,
, , width, height,
/*parent hwnd*/, /* menu */, hInstance, /*extra*/); if( !hwnd )
{
::MessageBox(, "CreateWindow() - FAILED", , );
return false;
} ::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd); //
// Init D3D:
// HRESULT hr = ; // Step 1: Create the IDirect3D9 object. IDirect3D9* d3d9 = ;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION); if( !d3d9 )
{
::MessageBox(, "Direct3DCreate9() - FAILED", , );
return false;
} // Step 2: Check for hardware vp. D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps); int vp = ;
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 = ;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = ;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = ;
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
::MessageBox(, "CreateDevice() - FAILED", , );
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, , , , 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;
}

d3dUnility.cpp

#include "d3dUtility.h"

IDirect3DDevice9* Device = ; 

//
// 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.
{
Device->Clear(, , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, );
Device->Present(, , , );
}
return true;
} //
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_DESTROY:
::PostQuitMessage();
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,
, , true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(, "InitD3D() - FAILED", , );
return ;
} if(!Setup())
{
::MessageBox(, "Setup() - FAILED", , );
return ;
} d3d::EnterMsgLoop( Display ); Cleanup(); Device->Release(); return ;
}

main.cpp

初始化Direct3D的更多相关文章

  1. Explanation About Initilizing A DirextX3D Class 关于初始化Direct3D类的解释

    目录 DirectX11 Study Note Create a DirectX graphics interface factory.创建一个DirectX图形界面工厂 CreateDXGIFact ...

  2. 《DirectX 9&period;0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

    REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...

  3. DirectX9:第一章 初始化Direct3D

    一.Direct3D概述 Direct3D是一套底层图形API,可以被视为应用程序与图形设备交互的中介. 应用程序.Direct3D以及硬件之间的交互关系: 在Direct3D和图形设备之间有一个环节 ...

  4. DirectX9&colon;基础篇 第一章 初始化Direct3D

    一.简介 二.Direct3D类 1.创建D3D类 IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion); //Direct3D类的创建 IDirec ...

  5. DirectX11笔记&lpar;三&rpar;--Direct3D初始化2

    原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ...

  6. Direct3D 纹理映射

    纹理映射是将2D的图片映射到一个3D物体上面,物体上漂亮图案被称为纹理贴图, 一个表面可以支持多张贴图等等,下面简单介绍下纹理贴图 纹理贴图UV: 贴图是一个个像素点组成,每一个像素点都由一个坐标最后 ...

  7. Direct3D 索引缓存

    小学的时候我们知道3个顶点组成一个三角形,那么四个顶点我们会说有4个三角形.这就是一个顶点同时参与了四次绘制三角形的结果. 在程序中也一样,比如我们绘制的两个三角形是挨着一起的,总有几个顶点是重合的. ...

  8. Direct3D 顶点缓存

    今天我们来学习下Direct3D的顶点和顶点缓存,首先我们需要在场景中绘制一些物体,物体都是由多个三角形组成,每一个三角形由三个顶点组成,我们来看下面一个NPC的模型 左图:正常的模型         ...

  9. DirectX 初始化DirectX&lpar;手写和红龙书里面的方式&rpar;

    上次介绍了如何初始化Direct3D,这次手写一次初始化代码,都是一样的方式不过看起来整洁一点. 创建一个Win32空项目添加一个空类增加以下代码即可. #include "CreateDe ...

随机推荐

  1. 基于Xenomai和工控机的实时测控系统的研究

    http://www.docin.com/p-1006254643-f6.html

  2. android TextView 文字垂直的设置

    <TextView android:id="@+id/tv_status" android:layout_width="wrap_content" and ...

  3. 宏page&lowbar;t

    /** Type of the index page */ typedef byte page_t;

  4. HttpClient的使用

    HttpClient的使用 一.简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTT ...

  5. iOS之NSDictionary和NSArray以及NSMutableDictionary和NSMutableArray:将不再是问题

    字典的key就相当于数组的下标,怎样操作数组你就学会了怎样才做字典:来感受一把 需要注意的是读取文件的类型要集合.plist文件的rooty:否则将不能读入文件 // 1.全国省市:得到的是省和市 / ...

  6. node&period;js零基础详细教程&lpar;3&rpar;:npm包管理、git github的使用

    第三章  建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑 ...

  7. Python的文件及异常

    1. Python的文件及异常 1.1 文件操作 1.1.1 从文件中读取数据 许多情况下,我们的信息是存储在文本中的.例如对用户行为的分析,用户访问系统或者网站的访问信息会被存储于文本中,然后对文本 ...

  8. Confluence 6 在编辑器中控制参数的显示

    你可以决定宏参数在 Confluence 编辑器中如何进行显示的. 在默认的情况下,在宏占位符下尽可能显示能显示的所有参数: 你可以控制这里显示的参数数量,通过这种控制你可能尽量的为编辑者提供有效的信 ...

  9. input输入的数据只允许整数和浮点型数据

    //第一步:引入jquery //第二步:input输入框绑定该函数 例如:<input type="text" name="price" onInput ...

  10. artTemplate子模板include

    art.Template:https://github.com/aui/art-template 下面来实现利用模版来实现递归调用生成tree <script type="text/h ...