欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    【 Visual C++】游戏开发笔记之二——最简单的DirectX,.pdf

    • 资源ID:70000686       资源大小:174.14KB        全文页数:5页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【 Visual C++】游戏开发笔记之二——最简单的DirectX,.pdf

    【C+游戏编程】游戏开发梦想的集散地毛星云(浅墨)的专栏C+游戏编程】游戏开发梦想的集散地毛星云(浅墨)的专栏 愿尽以绵薄之力,薪火相传游戏开发的信仰与梦想,复兴国产单机游戏。愿尽以绵薄之力,薪火相传游戏开发的信仰与梦想,复兴国产单机游戏。【Visual C+】游戏开发笔记之二最简单的DirectX,vc窗口的编写 Visual C+】游戏开发笔记之二最简单的DirectX,vc窗口的编写 分类:【DirectX】【Visual C+】游戏开发 2012-03-04 19:53 21964人阅读 评论(65)收藏 举报 游戏c+direct3dparametersnullwinapi 笔记一中我们介绍了如何用代码创建空的win32窗口,然而创建空的win32窗口只完成了一半的工作,接下来要做的工作是设置Direct3D,从而可以在屏幕上渲染图形。Direct3D要调用很多函数才能成功设置API。一旦完成设置,并且设置成功,就可以向屏幕上渲染图形。下面是函数中设置Direct3D所需的最少代码。bool InitializeD3D(HWND hWnd,bool fullscreen)D3DDISPLAYMODE displayMode;/Create the D3D object.g_D3D=Direct3DCreate9(D3D_SDK_VERSION);if(g_D3D=NULL)return false;/Get the desktop display mode.if(FAILED(g_D3D-GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)return false;/Set up the structure used to create the D3DDeviceD3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp);if(fullscreen)d3dpp.Windowed=FALSE;d3dpp.BackBufferWidth=640;d3dpp.BackBufferHeight=480;elsed3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=displayMode.Format;/Create the D3DDeviceif(FAILED(g_D3D-CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_D3DDevice)return false;return true;上段代码中的InitializeD3D函数的参数有窗口句柄hWnd,标识窗口是否全屏的标识符fullscreen。窗口句柄是在调用CreateWindows()函数创建窗口句柄时,返回给WinMain()函数的数值。InitializeD3D()函数开始先调用Direct3DCreat9()函数。Direct3DCreat9()函数将创建一个Direct3D接口对象,并返回该对象。该函数所带的参数值为D3D_SDK_VERSION。如果从该函数创建的接口不为NULL(空),那么接口创建成功。如果是NULL,那么创建接口时就会出错。其他步骤很大程度上取决于是否成功调用Direct3DCreat9()函数,所以一旦出现错误,就会立刻退出Direct3D初始化程序。接下来调用的是GetAdapterDisplayMode()函数。该函数将返回当前的显示信息,如桌面分辨率(宽度和高度),显示格式,显示器的刷新频率等。该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。将D3DADAPTER_DEFAULT发送给函数,详细说明代码,通过这些代码可以获取想要的主显卡信息。1卡信息。检索显卡信息之后,函数接下来会创建D3DPRESENT_PARAMETERS对象。D3DPRESENT_PARAMETERS结构用于定义Direct3D窗口的显示信息。这样可以设置正在创建窗口的期望宽度和高度,刷新率,显示模式为全屏或窗口,后天缓存数目等。D3DPRESENT_PARAMETERS结构体的定义:typedef struct _D3DPRESENT_PARAMETERS_ UINT BackBufferWidth;/窗口宽度UINT BackBufferHeight;/窗口高度D3DFORMAT BackBufferFormat;/渲染后台缓存的格式UINT BackBufferCount;/想要用于渲染的后台缓存总数D3DMULTISAMPLE_TYPE MultiSampleType;D3DSWAPEFFECT SwapEffect;HWND hDeviceWindow;BOOL Windowed;BOOL EnableAutoDepthStencil;D3DFORMAT AutoDepthStencilFormat;DWORD Flags;UINT FullScreen_RefreshRateInHz;UINT FullScreen_PresentationInterval;D3DPRESENT_PARAMETERS;D3DPRESENT_PARAMETERS结构体是的前两个变量是BackBufferWidth(窗口宽度),BackBufferHeight(窗口高度)。接下来的变量BackBufferFormat代表渲染后台缓存的格式。将D3DFMT_DEFAULT发送给该参数,就会得到所要用到的桌面格式。该参数可以接收的其他参数值分别是D3DFMT_A2R10G10B10(红、绿、蓝各10位,Alpha通道2位,总计32位),D3DFMT_A8R8G8B8(红、绿、蓝Alpha各8位,总计32位)、D3DFMT_X8R8G8B8、D3DFMT_AIR5G5B5、D3DFMT_XIR5G5B5和D3DFMT_R5G5B5。BcakBufferCount是想要用于渲染的后台缓存总数。通常,使用一个后台缓存和一个主缓存,使用多个缓存会使动画更流畅,因为后台缓存上绘制内容,然后将结果复制到主缓存,主缓存将其显示在屏幕上。如果所有的事情都在主缓存处理,那么游戏玩家在玩游戏时,会看到正在刷新的屏幕,从而会产生视觉假象,破坏游戏的视觉效果。成员变量MultiSampleType、MultiSampleQuality和SwapEffect处理交换效果。hDeviceWindow是调用WinMain()中的CreateWindow()函数创建的窗口句柄。Windowed标识符用于指定创建的窗口是否是全屏窗口。EnableAutoDepthStencil标识符用于设置是否用Direct3D管理缓存深度以及模板缓存。AutoDepthStencilFormat将深度和模板缓存设置为BackBufferFormat可以使用的相同值之一。结构中的最后三个变量分别是Flags、FullScreen_RefreshRateInHz和PresentationInterval。Flags标识符可以是D3DPRESENTFLAG_DEVICECLIP、D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL和D3DPRESENTFLAG_LOCKABLE_ BUFFER或D3DPRESENTFLAG_VIDEO的任意组合。变量FullScreen_RefreshRateInHz存储显示器的刷新率。对窗口模式程序而言,该值必须为0,但对全屏模式而言,该值取决于显示器。对此,可以调用GetDisplayAdapter()函数获取显示模式。最后一个变量PresentationInterval处理可以显示的交换链的后台缓存的最大次数。交换链主要让程序有多个窗口在桌面上同时显示(每个渲染自己的窗口)本书不涉及交换链的讨论,所以这里将不使用该变量。程序清单1.3 InitializeD3D()函数中调用的最后一个函数是CreateDevice()。该函数主要负责创建Direct3D设备对象,该对象用于向屏幕渲染图形。如果函数失败,最后一个参数(对象被发送给ppReturnedDeviceInterface)将为NULL(空)。测试函数是否失败的另一种方法是判断函数的返回值是否是D3D_OK以外的其他值。如果不是D3D_OK,则意味着创建过程中出现了问题,而且不会按照给定的规格创建设备。下面的代码给出了CreateDevice()的函数原型。CreateDevice()函数原型代码如下:HRESULT CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS*pPresentationParameters,IDirect3DDevice9*ppReturnedDeviceInterface);2CreateDevice()函数中的第一个参数是Adapter。该参数用于指定正在使用的显卡。第二个参数DeviceType是一个标识符,用于指定Direct3D中的渲染方式。该参数的参数值可以是采用硬件渲染的D3DDEVTYPE_HAL、采用软件渲染的D3DDEVTYPE_REF、不需要软硬件支持的D3DDEVTYPE_NULLREF,或是采用要进行渲染工作的可插拔软件的D3DDEVTYPE_SW。软件渲染标识符允许运行Direct3D程序,它可以使用硬件不支持的特性。软件渲染存在的问题是渲染速度慢,尤其是在开发游戏时。下一参数hFocusWindow也是一个窗口句柄。参数BehaviorFlags是标识符组合,用于指定设备的运行方式。pPresentationParameter是一个指针,它指向该函数前面创建的D3DPRESENT_PARAMTERS结构。ppReturnedDeviceInterface是一个指针,它指向新创建的Direct3D设备对象。如果该对象为NULL(空),或是函数返回除D3D_OK以外的值,那么Direct3D设备的创建失败。一旦完成Direct3D的设置和创建,就可以随意渲染屏幕。初始化阶段的CreateDevice()函数中创建的设备对象可以完成Direct3D中的渲染工作。渲染屏幕开始先要清屏为指定的颜色,告知Direct3D将要开始绘制新场景,渲染想要渲染的物体,完成屏幕渲染,在屏幕上显示渲染结果。代码1.6给出了验证这个过程的例子代码。例子代码创建简单的显示空白黑屏的函数。在屏幕上绘制一个空白屏的代码:void RenderScene()/Clear the backbuffer.g_D3DDevice-Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);/Begin the scene.Start rendering.g_D3DDevice-BeginScene();/End the scene.Stop rendering.g_D3DDevice-EndScene();/Display the scene.g_D3DDevice-Present(NULL,NULL,NULL,NULL);RenderScene()函数开始先清除后台缓存。调用Direct3D设备对象的Clear()函数可以完成该工作。Clear()函数的参数包括:要清除的矩形数目(0代表清除整个屏幕)、定义想要清除的屏幕区域矩形链表(NULL代表整个屏幕)、标识要清除内容的标识符、清除后的颜色、要设定的深度值、设定模板缓存值。对标识符参数而言,D3DCLEAR_DEFAULT清除所有的渲染目标,D3DCLEAR_STENCIL清除模板缓存,而D3DCLEAR_ZBUFFER清除深度缓存。后面将会更多地介绍深度缓存。一旦完成清除工作,渲染函数将调用设备对象的BeginScene()函数,在Direct3D中启动一个新场景。在Direct3D中渲染任何图形前,都必须先调用BeginScene()函数。一旦渲染完要渲染的物体,就调用设备对象的EndScene()函数结束渲染。记住:每个BeginScene()函数必须有一个与之对应的EndScene()函数。由于这里只是绘制了一个空白窗口,所以在BeginScene()和EndScene()之间不需要添加任何代码。最后一步是在屏幕上显示渲染结果。调用设备对象的Present()函数可以完成显示。就目前的学习而言,Present()函数的参数可以全部设为NULL(空)。第一个参数是正在显示的原始矩形,如果不使用交换链,那么该值必须为NULL(空)。第二个参数是一个指针,它指向要渲染的最终矩形。第三个参数是正在显示的窗口的窗口句柄。另外,由于没有用到交换链,所以对正在使用的窗口句柄而言,该值设为NULL(空)。这个正在使用的窗口句柄是在Direct3D初始化过程中为D3DPRESENT_PARAMETERS对象设置的窗口句柄。Present()函数中的最后一个参数是缓存区域,它代表需要更新的最小区域。同样,该参数涉及到交换链,也可以设为NULL(空)。既然可以使用Direct3D初始化和渲染屏幕,那么剩下要做的工作是在退出程序时,释放对象。在Direct3D中,会发现通常要在退出程序前释放系统使用的内存,从而避免内存泄漏。所有要释放的内存都可以通过调用对象的Release()函数释放。Release()函数会减少对3序前释放系统使用的内存,从而避免内存泄漏。所有要释放的内存都可以通过调用对象的Release()函数释放。Release()函数会减少对象的引用计数。如果引用计数降为0,那么系统就可以安全地从内存中删除对象。如果对单个对象有多个引用,那么必须牢记对所有的对象都要调用Release()函数,否则将不会释放内存。要牢记的规则就是:如果创建了对象,那么最终就要释放该对象。下述代码给出了在一个名为Shutdown()的函数中释放两个Direct3D对象的方法。释放所有的Direct3D对象的代码void Shutdown()if(g_D3DDevice!=NULL)g_D3DDevice-Release();if(g_D3D!=NULL)g_D3D-Release();g_D3DDevice=NULL;g_D3D=NULL;到这里,基本的模块都已经一目了然了,下面我们把他串联起来,构成一个整体。完整的Blank Window演示程序代码如下:#include#pragma comment(lib,d3d9.lib)#pragma comment(lib,d3dx9.lib)#define WINDOW_CLASS UGPDX#define WINDOW_NAME Blank D3D Window/Function Prototypes.bool InitializeD3D(HWND hWnd,bool fullscreen);void RenderScene();void Shutdown();/Direct3D object and device.LPDIRECT3D9 g_D3D=NULL;LPDIRECT3DDEVICE9 g_D3DDevice=NULL;LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)switch(msg)case WM_DESTROY:PostQuitMessage(0);return 0;break;case WM_KEYUP:if(wParam=VK_ESCAPE)PostQuitMessage(0);break;return DefWindowProc(hWnd,msg,wParam,lParam);int WINAPI WinMain(HINSTANCE hInst,HINSTANCE prevhInst,LPSTR cmdLine,int show)/Register the window classWNDCLASSEX wc=sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,WINDOW_CLASS,NULL;RegisterClassEx(&wc);/Create the applications windowHWND hWnd=CreateWindow(WINDOW_CLASS,WINDOW_NAME,WS_OVERLAPPEDWINDOW,100,100,640,480,GetDesktopWindow(),NULL,wc.hInstance,NULL);/Initialize Direct3Dif(InitializeD3D(hWnd,false)/Show the windowShowWindow(hWnd,SW_SHOWDEFAULT);UpdateWindow(hWnd);/Enter the message loopMSG msg;ZeroMemory(&msg,sizeof(msg);while(msg.message!=WM_QUIT)if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)TranslateMessage(&msg);DispatchMessage(&msg);elseRenderScene();/Release any and all resources.Shutdown();/Unregister our window.UnregisterClass(WINDOW_CLASS,wc.hInstance);return 0;4bool InitializeD3D(HWND hWnd,bool fullscreen)D3DDISPLAYMODE displayMode;/Create the D3D object.g_D3D=Direct3DCreate9(D3D_SDK_VERSION);if(g_D3D=NULL)return false;/Get the desktop display mode.if(FAILED(g_D3D-GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)return false;/Set up the structure used to create the D3DDeviceD3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp);if(fullscreen)d3dpp.Windowed=FALSE;d3dpp.BackBufferWidth=640;d3dpp.BackBufferHeight=480;elsed3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=displayMode.Format;/Create the D3DDeviceif(FAILED(g_D3D-CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_D3DDevice)return false;return true;void RenderScene()/Clear the backbuffer.g_D3DDevice-Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);/Begin the scene.Start rendering.g_D3DDevice-BeginScene();/End the scene.Stop rendering.g_D3DDevice-EndScene();/Display the scene.g_D3DDevice-Present(NULL,NULL,NULL,NULL);void Shutdown()if(g_D3DDevice!=NULL)g_D3DDevice-Release();if(g_D3D!=NULL)g_D3D-Release();只要成功安装了DirectX SDK,并配置好DirectX的开发环境,则万事俱备。我们先编译该程序,然后运行它。我们可以看到一个640480分辨率的空白窗口。下面给出了运行后的窗口截图:以上就是本节笔记的全部内容。本节源代码请点击这里下载:【Visual C+】Code_Note_2请大家继续关注【Visual C+】游戏开发笔记系列,谢谢大家一直的支持The end5

    注意事项

    本文(【 Visual C++】游戏开发笔记之二——最简单的DirectX,.pdf)为本站会员(qwe****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开