DirectX SDK (August 2008).Direct3D 9.官方指导教程 (一)

原文: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渲染顶点将会告诉你如何使用顶点来画几何图形。 

posted @ 2009-09-17 12:04  Maxice  阅读(3593)  评论(0编辑  收藏  举报