DirectX 图形接口指南(2)

DirectX 专栏收录该内容
3 篇文章 0 订阅

指南一:创建设备

为了使用 Microsoft Direct3D,你首先需要创建一个应用程序窗口,并紧接着创建和初始化 Direct3D 对象。你应该使用这些对象提供的 COM 接口来操纵它们,以及创建描绘一个场景所必需的其它对象。本指南包含的 CreateDevice 示例将例示并说明以下几个工作:创建 Direct3D 设备并且绘制一个简单的蓝色屏幕。

这个指南使用以下步骤:初始化 Direct3D,绘制场景,以及最后清理与关闭。

 

·步骤一:创建一个窗口

·步骤二:初始化 Direct3D

·步骤三:处理系统消息

·步骤四:绘制与显示场景

·步骤五:关闭与清除

 

注意:CreateDevice 示例程序的路径在:

(SDK root)/Samples/Multimedia/Direct3D/Tutorials/Tut01_CreateDevice.

 

步骤一:创建一个窗口

任何 Microsoft Windows 程序执行中必须要作的第一件事就是创建一个应用程序窗口并将其显示给用户。为做到这点,CreateDevice 例程将首先实现它的 WinMain 函数。以下示例代码完成了窗口的初始化。

 

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,

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

 

前述示例代码是标准的 Windows 编程。例子开始时定义和注册了一个窗口类名为 "D3D Tutorial"。类注册以后,示例代码使用已注册的类创建了一个基本的顶层(top-level)窗口,客户区域为 300 像素宽,300 像数高。这个窗口没有菜单或子窗口。示例使用了 WS_OVERLAPPEDWINDOW 属性创建一个包括最大化,最小化,以及关闭按钮的普通窗口。(如果该例程将运行在全屏模式下,首选的窗口属性应该是WS_EX_TOPMOST,它指定创建的窗口置于并且保持在所有非最高(non-topmost)窗口之前,甚至在窗口失活的情况下。)一旦窗口创建完成,例代码调用标准的 Microsoft Win32 函数显示和更新窗口。

 

在应用程序窗口准备好以后,你就能开始设置具体的 Microsoft Direct3D 对象了,

请见:步骤二:初始化 Direct3D

 

步骤二:初始化 Direct3D

 

CreateDevice 示例在 WinMain 中创建窗口之后,调用该程序定义的函数 InitD3D 完成 Microsoft Direct3D 初始化过程。在创建窗口之后,程序已经准备好初始化你将用来绘制场景的 Direct3D 对象了。这个过程包括创建一个 Direct3D 对象,设置Present Parameters,以及最后创建 Direct3D 设备。

                       

创建完 Direct3D 对象之后,你可以立即使用 IDirect3D8::CreateDevice 方法创建 Direct3D 设备。你也能够使用 Direct3D 对象枚举设备,类型,模式以及其他东西。这些工作的代码段应位于使用 Direct3DCreate8 函数创建 Direct3D 对象之后。

 

if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )

    return E_FAIL;

 

传递给 Direct3DCreate8 的唯一参数应该始终是 D3D_SDK_VERSION,它告诉 Direct3D 当前使用的头文件信息。无论如何,头文件或者其他的变化将导致这个值增加并强制使用该值的应用程序重新编译。如果此版本不匹配,调用 Direct3DCreate8 将失败。

 

下一个步骤是使用 IDirect3D8::GetAdapterDisplayMode 接口找到当前的显示模式,代码如下:

 

D3DDISPLAYMODE d3ddm;

if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )

    return E_FAIL;

 

D3DDISPLAYMODE 结构中的 Format 变量将被用于创建 Direct3D 设备。如果是运行于窗口模式下的话,Format 参数通常用来创建一个与适配器当前模式相匹配的后背缓冲 (Back buffer)

 

在给 D3DPRESENT_PARAMETERS 各参数赋值时,你必须指定你的应用程序在3D下工作的方式。本 CreateDevice 例程设置D3DPRESENT_PARAMETERS结构中 Windowed TRUESwapEffect D3DSWAPEFFECT_DISCARDBackBufferFormat d3ddm.Format

 

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory( &d3dpp, sizeof(d3dpp) );

d3dpp.Windowed   = TRUE;

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

d3dpp.BackBufferFormat = d3ddm.Format;

 

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

 

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,

                                  &d3dpp, &g_pd3dDevice ) ) )

 

前述代码使用 D3DADAPTER_DEFAULT 标志创建了一个使用省缺适配器的设备。在非常多数的情况下,系统只有一个适配器,除非它安装了多个图形加速卡。通过把 DeviceType 参数设成 D3DDEVTYPE_HAL,表示你希望获得一个实际硬件设备 (hardware device) 而不是软件虚拟设备 (software device)。示例代码还使用 D3DCREATE_SOFTWARE_VERTEXPROCESSING 标志通知系统使用软件顶点处理 (software vertex processing)。注意,如果你指定 D3DCREATE_HARDWARE_VERTEXPROCESSING 标志通知系统使用硬件顶点处理 (hardware vertex processing),你可以在支持硬件顶点处理的图形加速卡上得到大幅度的性能提升。

 

现在 Direct3D 已经初始化完毕,下一步是确保你的程序具有一个机制用来来处理系统消息,

见下文:步骤三:处理系统消息

 

步骤三:处理系统消息

                       

完成创建程序窗口以及初始化 Direct3D 以后,你已经准备好绘制场景 (Render scene)。大多数情况下,Microsoft Windows 程序在它们的消息循环里监视系统消息,并且在队列里没有消息时绘制画面帧。然而,CreateDevice 例程仅仅在等到一个WM_PAINT出现在队列里时,才通知应用程序重绘窗口的所有部分。

 

// The message loop.

MSG msg;

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

{

    TranslateMessage( &msg );

    DispatchMessage( &msg );

}

 

当每循环一次,DispatchMessage 调用 MsgProc,后者负责处理队列里的消息,当 WM_PAINT 消息进队时,调用该程序自身定义的函数 Render(),它将负责重绘窗口。然后 Microsoft 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 );

}

 

现在,应用程序处理了系统消息,接着的一步是绘制显示,见:步骤四:绘制与显示场景

 

步骤四:绘制与显示场景

 

为了描绘和显示需要的场景,本例程在这一步把后背缓冲 (back buffer) 填充为蓝色,然后将此后背缓冲的内容传给前景缓冲 (front buffer), 并且将前景缓冲提交至屏幕。

 

清除表面,应调用 IDirect3DDevice8::Clear 函数:

 

// Clear the back buffer to a blue color

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

 

Clear() 接受的前两个参数通知 Microsoft Direct3D 被清除的矩形区域数组的基址和大小,该矩形区域数组描述了绘制目标表面 (render target surface) 里需要清除的区域。

 

在大多数情况下,只使用单个矩形覆盖整个绘制目标表面。这样你只需设置第一个参数为 0 及第二个参数为 NULL。第三个参数将决定方法的行为,你可以通过设置特定的标志用来清除绘制目标表面 (render target surface),关联的Z缓冲 (associated depth buffer),模版缓冲 (stencil buffer),以及任意这三者的混合。本指南不使用Z缓冲,所以仅仅使用了 D3DCLEAR_TARGET 标志。最后三个参数分别用于设置对应绘制目标表面、Z缓冲和模版缓冲的清除填充值 (reflect clearing values)。该 CreateDevice 例程将绘制目的表面的清除填充色设置为蓝色 (D3DCOLOR_XRGB(0,0,255)。由于相应的标志没有设置,最后两个参数被 Clear() 忽略。

 

在清除了视口 (viewport) 之后,CreateDevice 例程告知 Direct3D 绘图将要开始,然后立即通知这次绘制完成,见以下代码段:

 

// Begin the scene.

g_pd3dDevice->BeginScene();

 

// Rendering of scene objects happens here.

 

// End the scene.

g_pd3dDevice->EndScene();

 

当绘制开始或完成时,IDirect3DDevice8::BeginScene IDirect3DDevice8::EndScene 函数将用信号通知系统。你只能在这两函数之间调用其它的绘图函数。即使调用绘图函数失败,你也应该在重新调用 BeginScene 之前调用 EndScene

 

绘制完之后,调用 IDirect3DDevice8::Present显示该场景:

 

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

 

Present() 接受的前两个参数是原始矩形和目标矩形。在这一步,例程设置这两个参数为 NULL 并把整个后备缓冲提交到前景缓冲。第三个参数用于设置该次提交的目标窗口。因为这个参数被设为 NULL,实际使用的窗口是 D3DPRESENT_PARAMETERS hWndDeviceWindow 成员。第四个是 DirtyRegion 参数,在绝大多数情况下应该设为 NULL

 

本指南的最终步骤是关闭应用程序,见:步骤五:关闭与清除

 

步骤五:关闭与清除

                       

在执行的若干时刻,你的应用程序必须立即关闭。关闭一个 Direct3D 应用程序中不只是意味着你必须销毁程序窗口,并且你还要释放程序中使用过的的任何 Direct3D 对象并且无效化它们的指针。当收到一个 WM_DESTROY 消息时,CreateDevice 例程通过调用一个本地定义的函数 Cleanup() 来处理这些工作。

 

VOID Cleanup()

{

    if( g_pd3dDevice != NULL)

        g_pd3dDevice->Release();

    if( g_pD3D != NULL)

        g_pD3D->Release();

}

 

上述函数对每个对象调用 IUnknown::Release 方法来释放它们自身。由于DirectX遵循 COM 规则,大多数对象当其引用计数降为0时,DirectX会自动的从内存中释放这个对象。

 

对于其他关闭程序情况,可能发生在程序的平常执行中——比如用户改变了桌面的参数或色深——此时你可能需要撤销和重建使用中的 Microsoft Direct3D 对象。因此一个好的主意就是将你的释放代码放到一起,以便能在需要时随时调用它。

 

本指南已经说明了如何创建一个设备,指南二:演示顶点(Render Vertex) ,将告诉你如何用顶点(Vertex)创建几何形体。

 

(指南二:演示顶点 见本文第三部分...)

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目的实战源码是我发布在 GitHub 上的开源项目 newbee-mall 新蜂商城,目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能的讲解,让大家实际操作并实践上手一个大型的线上商城项目,并学习到一定的开发经验以及其中的开发技巧。<br /> 商城项目所涉及的功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂的操作步骤,仅需 2 秒就可以启动这个完整的商城项目 </li> <li> 最终的实战项目是一个企业级别的 Spring Boot 大型项目,对于各个阶段的 Java 开发者都是极佳的选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,可以进一步提升你的市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目的页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值