自己翻译的官方帮助文档里面的教程一,因为昨晚自己弄出来觉得很高兴哈。有新手觉得难入手的不妨看下我这篇。
最下面有VC的设置。(我的SDK版本比较老了哈,是9.0April2006)
第一步 建立windows窗口
每一个windows程序做的第一件事就是当它运行时要产生一个程序窗口显示给使用者看。为做到这个,CreateDevice样例是在它的WinMain函数里面开始运行的。下面这个代码演示了窗口的初始化。
INT WINAPI WinMain(HISNTACE hInst, HINSTACE, LPSRT, INT) { // Register the window class. WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL),NULL, NULL, NULL, NULL, "Direct3D Tutorial", NULL}; RegisterClassEx( &wc ); // Create the application's window. 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函数来显示和更新窗口。
当程序窗口准备好以后,你可以开始设置必需对象的Direct3D,这将在第二部——初始化Direct3D中提到。
第二步 初始化Direct3D
CreateDevice样例将在窗口建立后从WinMain中调用在InitD3D程序功能来演示了Direct3D初始化。在你创建程序窗口后,你开始初始化Direct3D对象(你将用这个对象渲染场景)。这个过程包含了产生对象,设置参数,最后创建Direct3D设备。
创建一个Direct3D对象后,使用CreateDevice方法产生设备,并且枚举设备,类型,模式等等。
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION)))
return E_FAIL;
唯一传递给Direct3DCreate9的参数总是D3D_SDK_VERSION。这个宏。无论何时小改变导致程序重编译这是指总是不变的。如果版本没有匹配,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;
最后的步骤是使用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_HARWARE_VERTEXPROCESSING硬件定点处理,你会看到在支持硬件顶点处理的视频卡上的性能出现了显著地增加。
现在Direct3D对象已经初始化完毕,下一步是确保你有一个处理系统消息的机制,详见第三步 处理系统消息。
第三步 处理系统消息
在你建立了应用程序和初始化Direct3D后,你应该开始渲染场景。大多数情况下,窗口程序在它们的消息循环中处理系统消息,无论消息队列里面有没有消息它们总会渲染场景。然而,CreateDevice样例会一直等待下去,直到队列里面出现了WN_PAINT消息,告诉程序它需要重画所有的窗口的部分。
// The message loop MSG msg; while(GetMessage( &msg, NULL, 0,0) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }
每一次循环运行,DispatchMessage都会调用MsgProc来处理队列中的句柄消息。当WM_PAINT在队列中,程序调用Render,程序就会重画窗口。然后Win32函数ValidateRect就会被调用来验证整个工作区。
LRESULT WINAPI MsgProc ( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: Render(); ValidateRect( hWnd, NULL ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam); }
现在程序可以处理系统消息,下一步就是渲染显示,第四步 渲染和显示场景会具体描述。
第四步 渲染和显示场景
为了渲染和显示场景,样本代码要清除后备缓存区成蓝色,转换后备缓存区成为前缓存区,并且把前缓存区显示到屏幕上。
调用Clear函数可以清除场景。
// Clear the back buffer to a blue color g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGB(0,0,255), 1.0f, 0 );
前两个被Clear接收的参数通知Direct3D的大小和将要清除的矩形的位置。矩形数组描述了将要清除的渲染目标表面。
在大多数情况下,你使用一个矩形来覆盖整个渲染目标。你只要设置第一参数为0,第二个为NULL。第三个决定了方法的行为,你可以定义一个状态来清除渲染目标表面,一个相关联的深度缓冲区,一个模板缓冲区,或者二者的结合体。这个教程不适用深度缓冲区,所以之所用了D3DCLEAR_TARGET唯一一个标志。最后三个是为渲染目标,深度缓冲区,模板缓冲区设置了三个值。CreateDevice样例为渲染目标表面设置了蓝色(D3DCOLOR_XRGB(0,0,255))。最后两个参数可以忽略,因为相应的标志位不存在。
之后,CreateDevice样例通知Direct3D渲染开始,然后标记渲染完成,正如下面代码所做到的那样:
// Begin the scene g_pd3dDevice->BeginScene(); // Rendering of scene ojects happens here // End the scene g_pd3dDevice->Endscene();
BeginScene和EndScene方法会在渲染开始和结束时标记给系统,你只能在这两个方法中间调用渲染方法。即使渲染方法调用失败,你也应该在BeginScene之前再调用一次EndScene。
渲染场景后,你应该用Present方法显示出来。
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
前两个是资源的矩形和目的地的矩形区域。这一步中样本代码通过设置两个参数为NULL会显示所有的后备缓存区到前缓存区。第三参数为这次显示设置目标窗口。因为参数被设置成NULL,D3DPRESENT PARAMETERS中的hWndDeviceWindow将会被使用。第四参数是脏矩形的参数,大多数情况下应该被设置成NULL。
最后一步将是关闭程序,具体详见第五步,关闭。
第五步 关闭
在运行的时候,你的程序最后应该关闭。DirectX程序关闭不仅仅一位这你摧毁应用程序窗口,你还应该销去DirectX对象,然后使指针无效。CreateDevice样例调用了Cleanup,系统将会在接收到WM_DESTROY消息后处理。
VOID Cleanup() { if(g_pd3dDevice!=NULL) g_pdedDevice->Release(); if(g_pD3D != NULL) g_pD3D ->Release(); }
销毁每一个Direct3D对象都是调用IUnknown中得方法。应为这个教程遵循COM规则,大多数对象的引用次数都应该置零,自动从内存中移除。
除了关闭,即使子啊运行时——比如当用户改变了桌面分辨率或者颜色深度时——你可能需要销毁并重新创建MS D3D对象。因此,在程序的一个地方有清除代码是个好主意。
这个教程为你展示了如何创建一个设备。下面的一个教程是 渲染节点,会为你展示如何使用定点来画集合形状
附/Microsoft DirectX SDK (April 2006)/Samples/C++/Direct3D/Tutorials/Tut01_CreateDevice中的源代码
//----------------------------------------------------------------------------- // File: CreateDevice.cpp // // Desc: This is the first tutorial for using Direct3D. In this tutorial, all // we are doing is creating a Direct3D device and using it to clear the // window. // // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #include <d3d9.h> #pragma warning( disable : 4996 ) // disable deprecated warning #include <strsafe.h> #pragma warning( default : 4996 ) //----------------------------------------------------------------------------- // Global variables //----------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device //----------------------------------------------------------------------------- // Name: InitD3D() // Desc: Initializes Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D( HWND hWnd ) { // Create the D3D object, which is needed to create the D3DDevice. if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; // Set up the structure used to create the D3DDevice. Most parameters are // zeroed out. We set Windowed to TRUE, since we want to do D3D in a // window, and then set the SwapEffect to "discard", which is the most // efficient method of presenting the back buffer to the display. And // we request a back buffer format that matches the current desktop display // format. D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // Create the Direct3D device. Here we are using the default adapter (most // systems only have one, unless they have multiple graphics hardware cards // installed) and requesting the HAL (which is saying we want the hardware // device rather than a software one). Software vertex processing is // specified since we know it will work on all cards. On cards that support // hardware vertex processing, though, we would see a big performance gain // by specifying hardware vertex processing. if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } // Device state would normally be set here return S_OK; } //----------------------------------------------------------------------------- // Name: Cleanup() // Desc: Releases all previously initialized objects //----------------------------------------------------------------------------- VOID Cleanup() { if( g_pd3dDevice != NULL) g_pd3dDevice->Release(); if( g_pD3D != NULL) g_pD3D->Release(); } //----------------------------------------------------------------------------- // Name: Render() // Desc: Draws the scene //----------------------------------------------------------------------------- VOID Render() { if( NULL == g_pd3dDevice ) return; // Clear the backbuffer to a blue color g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 ); // Begin the scene if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { // Rendering of scene objects can happen here // End the scene g_pd3dDevice->EndScene(); } // Present the backbuffer contents to the display g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- // Name: MsgProc() // Desc: The window's message handler //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; case WM_PAINT: Render(); ValidateRect( hWnd, NULL ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // Name: WinMain() // Desc: The application's entry point //----------------------------------------------------------------------------- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { // Register the window class WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "D3D Tutorial", NULL }; RegisterClassEx( &wc ); // Create the application's window HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, wc.hInstance, NULL ); // Initialize Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { // Show the window ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); // Enter the message loop MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } UnregisterClass( "D3D Tutorial", wc.hInstance ); return 0; }
编译的时候要记住设置头文件和库的地址,还有连接时也要记得自己补上库,我是用VC6运行的
下面我给出编译这个文件的过程
先打开VC6 新建-工程-WIN32 APPLECATION 写你的工程名(图一)
然后选空工程 (图二)
之后要设置头文件 工具-选项-目录(图三,图四)把你的头文件地址复制上去,记得要放在第一个,不然VC会用自己的DIRECT头文件可能会发生错误
之后是设置连接 具体是 工程-设置-连接 在图五红框里面写d3d9.lib d3dx9.lib 不然会跳出external symbol_Direct3DCreate9@4 错误 我就在这里纠结了很久 哈哈
最后编译运行都OK啦~~~~看结果