Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128367
  • 博文数量: 44
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-07 23:06
文章分类

全部博文(44)

文章存档

2010年(6)

2009年(38)

我的朋友

分类:

2009-12-07 23:44:52

原文:Microsoft DirectX SDK (August 2008)àDirect3D 9.Tutorials and Samples
Tutorial 1: Creating a Device

Direct3D 9 的样例教程(Tutorials and Samples for direct3D9)

   此DX开发包提供弱干资源和例程代码。

   Tutorials都是彻底从头重新编写的仅仅包含运行Direct3D功能函数的必须应用程序接口(API)。

   Samples都演示了Direct3D 9的最新特征和最基本的函数功能,所有的Direct3D样例都建立在DXUT之上。



Tutorials

以下的Tutorials演示了Direct3D基本功能也仅仅是SDK里面所提供的。



Direct3D Tutorials

这里的引导教程向你展示了如何在C/C++程序中使用Direct3D和D3DX。这些工作分成为以下必要的几步:

Tutorial 1: 创建设备(Creating a Device)

Tutorial 2: 渲染顶点(Rendering vertices)

Tutorial 3: 使用矩阵(Using Matrices)

Tutorial 4: 创建和使用光照(Creating and using lights)

Tutorial 5: 使用纹理贴图(Using Texture Maps)

Tutorial 6: 使用网格(Using Meshes)

这些教程的代码都是来自各个教程所提供的源工程中,代码程序都是用C++编写,如果你正在使用C编译器,那么你必须为它们做些合理的改变以便成功的编译程序,至少你需要把vtable和指针加入到这些接口函数



有些例程中的注释可能和平台sdk源文件中的不同,这些改变仅仅为了更简洁,但并没有改变所要表达的意思。





Tutorial 1: (创建设备环境)Creating a Device

为了使用Direct3D,第一步你创建一个应用程序窗口,然后创建和初始化Direct3D对象。你使用组件对象模型接口(component object model(com) interfaces),这些对象执行渲染场景所必须的对象。创建环境样例工程是为了说明创建Direct3D设备的工作和创建一个蓝色的屏幕。

些例程使用如下几步:初始化Direct3D, 渲染场景,最后完全关闭。



步骤:

第一步:创建窗口(Creating a Window)

第二步:初始化Direct3d(Initializing Direct3d)

第三步:处理系统消息(Handling System Messages)

第四步:渲染和显示一个窗口(Rendering and Displaying a Scene)

第五步:关闭(Shutting Down)

Note: CreateDevice例程工程文件路径为

((SDK root)\Samples\C++\Direct3D\Tutorials\Tut01_CreateDevice)



Step 1 – 创建窗口(Creating a Window)

所有的Windows应用程序在他们运行时首先都必须做的是,为用户创建一个应用程序窗口来显示。为了做到这点CreateiDevice工程开始从WinMain函数执行。下面的例程执行窗口的初始化工作:

INT WINAPI WinMain( HINSTANCE hInst,   HINSTANCE, LPSTR, INT)

{

  
//注册窗口类

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,

GetModuleHandle(NULL), NULL, NULL, NULL, NULL, “Direct3d Tutorial”, NULL};

   RegisterClassEx(&wc);


  
//创建窗口

  
HWND hWnd = CreateWindow( “Direct3d Tutorial”, “ Direct3d Tutorial 01:CreateDevice”,

             WS_OVERLAPPEDWINDOW, 100,100,300,300,

             GetDesktopWindow(), NULL, wc,hInstance, NULL);


   以上的样程是标准的WINDOWS编程,样程人定义和注册一个叫做“Direct3d Tutorial”的窗口类开始,在类被注册后,使用注册过的类创建一个最高层的窗口,用户区大小为300像素宽和300像素高。并且没有菜单和子窗口。使用WS_OVERLAPPEDWINDOW窗口样式创建一个包括最小化、最大化和关闭按钮的应用程序框架。(如果例程要运行在全屏模式下,首选的窗口样式为 WS_EX_TOPMOST, 指定创建的窗口应该放在所有非顶端窗口之上,即使窗口处于非激活状态。)当窗口创建完成后,程序调用标准Win32函数来显示和刷新窗口。



Step 2 – 初始化Direct3D(Initializing Direct3D)

例程CreateDevice展示了在InitD3D程序中Direct3D的初始化工作,定义了在创建窗口之口被Winmain调用的函数。在创建一个应用程序窗口之后,你已经准备好去初始化一个你将用来渲染场景的Direct3D对象。这个过程包括:创建对象,定义显示参数,最后创建Direct3D设备。

在创建一个Direct3D对象之后,使用 Idirect3D9::CreateDevice方法创建设备,并且枚举用命设备,类型,样式等等。

If( NULL == ( g_pD3D = Direct3dCreate9( D3D_SDK_VERSION ) ) )

   Return E_FAIL;


传给Direct3Dcreate9() 函数的参数必须是 D3D_SDK_VERSION, 这个参数告诉Direct3D使用正确的头文件,这个值会在任何时间头文件或其它改变需要重新建立工程时增加。如果版本不匹配,Direct3Dcreate9将会失败。

在填写D3DPRESENT_PARAMETERS 结构本之后你可以指定你的3D程序如何表现。在CreateDevice例程中指定窗口化(Windowed)为TRUE, SwapEffect为D3DSWAPEFFECT_DISCARD, BackBufferFormat 为 D3DFMT_UNKNOWN.

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory( &d3dpp, sizeof( d3dpp ) );

d3dpp.Windowed = TRUE;

d3dpp.Swapeffect = D3DSWAPEFFECT_DISCARD;

d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;



最后一步是 使用 Idirect3D9::CreateDevice 函数来创建Direct3D设备,如下代码:

If( FAILED( g_pD3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,

             hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,

&g_pd3dDevice ) ) )


以上代码创建设备使用 D3DADAPTER_DEFAULT 标记来指定使用默认的显示器,在大多数情况下系统会使用单一的显示器,除非安装了多个图形硬件显卡,参数D3DDEVTYPE_HAL来指定设备类型为硬件设备而不是软件设备,使用D3DCREATE_SOFTWARE_VERTEXPROCESSING标记来告诉系统使用软件顶点处理方法,注意如果你使用D3DCREATE_HARDWARE_VERTEXPRICESSING参数来指定系统使用硬件顶点处理方法,并且支持硬件顶点处理的话你将会看到从显示卡上获得的重大表现。

现在Direct3D对象已经初始化了,下一步是确保你有一个处理系统消息的方法。





Step 3 – 处理系统消息(Handling System Messages)

在你已经创建应用程序窗口和初始化了Direct3D之后,你已经准备好去渲染一个场景了。在大多数情况下Windows应用程序的消息监控系统在他们的消息循环中,并且在消息队列没有消息时进行渲染框架。但CreateDevice例程等到有WM_PAINT消息在队列中时才告诉应用程序它需要重画所有或窗口的部分。

//消息循环

MSG msg;

while( GetMessage( &msg, NULL, 0,0 )   )

{

   TranslateMessage( &msg );

   DispatchMessage( &msg );

}

每当消息循环时,DispatchMessage调用回调函数(MsgProc),来处理队列中的消息。当WM_PAINT在队列时,应用程序调用渲染函数开始窗口重绘,然后调用Win32函数VaildateRect()来使客户区生效。

本例程代码的消息处理函数如下:

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

{

   switchd( msg)

   {

             case WM_DESTROY:

                  PostQuitMessage( 0 );

                  return 0;

             case WM_PAINT:

                  render();

                  ValidateRect( hWnd, NULL );

                  erturn 0;

   }

   return DefWindowProc( hWnd, msg, wParam, lParam);



Step 4 – 渲染和显示一个场景(Rendering and Displaying a Scene)

为了渲染和显示场景,例程在这一步将后台缓存清空为蓝色,并将后台内容传输到前台缓存,然后将前台缓存显示到屏幕。

调用Idirect3Ddevice9::Clear()方法清空屏幕。

//
半后台缓存清空为蓝色

g_pd3dDevice -> Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255 ), 1.0f, 0);

Idirect3Ddevice9::Clear()的前两个参数用来告诉Direct3D要被清空的矩形区的大小的地址,矩形数组抽述了在渲染目标表面的要被清空的区域。

在多数情况下,使用单一矩形覆盖整个渲染目标,通过设定第一个参数为0和第二个参数为NULL来做到这些,第三个参数决定方法的行为。你可以指定下面的标记来清空渲染表面,一个相关联的深度缓存,纹理缓存,或是任何三个参数的组合。这个例程没有使用深度缓存,所以D3DCLEAR_TARGET是唯一使用的标记。最后三个参数用来为渲染目标,尝试缓存,纹理缓存指定数值。全程将渲染目标清空色指定为蓝色(D3DCOLOR_XRGB(0,0,255)),最后两个参数由于Clear方法没有指定相对应的标记所以补忽视。

在清空视口后,程序告诉Direct3D渲染半要开始,然后发送渲染完毕的信号,如下:

//开始场景

g_pd3dDevice -> BeginScene();

//在这里渲染场景在的对象



//结束渲染

g_pd3dDevice -> EndScend();



Idirect3Ddevice9::BgeinScene 和Idirect3Ddevice9::EndScene()两个方法告诉系统什么时候渲染开始和完成。你可以在这两个函数之间调用渲染函数。即使渲染失败你也必须在再次调用BeginScene()之前调用EndScene();

在渲染场景之后,你可以调用Idirect3Ddevice9::Present()方法来显示。



g_pd3dDevice - >Present( NULL, NULL, NULL, NULL);


前两个参数一个为源矩形一个为目标矩形,全程将这两个参数设为NULL来把整个后台缓存显示到前台缓存。第三个参数设定显示的目标窗口,由于设为了NULL所以就用到了hWndDeviceWindow的成员D3DPRESENT_PARAMETERS.第四个参数是垃圾区域参数在多数情况下都是NULL。

最后一步是关闭应用程序。



Step 5 – 完全关闭(Shutting Down )

在运行的某一时刻你的应用程序必须关闭。关闭一个DirectX应用程序不仅仅是消毁应用程序的窗口,你也必须分配你的应用程序使用的DirectX对象,并且使指向他们的指针无效。当例程收到WM_DESTROY消息时调用Cleanup()一个已经定义的方法来处理。



VOID Cleanup()

{

if( g_pd3dDevice != NULL )

   g_gd3dDevice -> Release();

if( g_pD3D != NULL )

   g_pD3D -> Release();

}

以上方法解除Direct3D对象,因为此例程遵循COM规则,大部分对象调用都必须清0或自动从内存移除。

另外正常的程序运行会有多次,比如当用户改变了桌面的分辨率或色深,你需要消毁并且重新生成Direct3D对象。因此将清除代码放在一个固定的地方是一个好主意,可以方便在需要时调用。



这个教程已经向你展示了如何创建一个设备,教程2:Rendering Vertices渲染顶点将会告诉你如何使用顶点来画几何图形。
阅读(1267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~