3、开始 Direct3D 绘制图形的准备

Direct3D 程序结构

 

与普通的win32 窗口程序不同的地方:在初始化时需要对Direct3D进行初始化,并且在程序中具有推行绘制过程。

 

 


 

 

第一步: 创建 IDirect3D9接口对象,用于获取本机显示硬件设备的信息,以及创建用于绘制3D图形的 IDirect3DDevice9 接口对象

 LPDIRECT3D9 pD3D=NULL;

pD3D=Direct3DCreate9(D3D_SDK_VERSION);

第二步: 获取硬件设备信息

获取硬件设备信息包括取得系统中所有可用的图形卡的性能、显示模式、格式及其他相关信息。例如:通常用来检测图形卡(或显卡)是否支持硬件顶点运算

 

 

 

Direct3D可以有两种不同的顶点运算方式,即 软件顶点运算和硬件顶点运算。其中,硬件顶点运算需要有显卡的支持,这种凡事将使用硬件专有的加速功能,其执行速度将远远快于软件顶点运算方式。

 

 

 

第三步:创建Direct3D设备接口

在创建 IDirect3DDevice9 接口对象之前,需要准备一个 D3DPRESENT_PARAMETERS

结构类型的参数,用于说明如何创建Direct3D 设备

 

  BackBufferWidth  BackBufferHeight   BackBufferCount 字段指定后台缓冲区的宽度、高度和数量。后台缓冲区是临时保存绘制内存的一片内存块,在通常情况下,其大小与窗口客户区的大小相同。

    BackBufferFormat 字段指定了后台缓冲区保存像素的格式,它可以用D3DFORMAT 枚举定义

 

MultiSampleType  和 MultiSampleQuality  成员指定了 多重采样的类型及格式,通常设为

D3DMULTISAMPLE_NONE 0

SwapEffect  成员指定 Direct3D  如何将后台缓冲区的内容复制到前台的缓存中,通常设为D3DSWAPEFFECT_DISCARD ,表示当后台缓冲区赋值到前台时清楚后台缓冲区内容

  hDeviceWindow 成员用于指定绘制图形的窗口句柄,为NULL时表示使用当前被激活的窗口。绘制窗体的显示模式由 Windowed 成员指定,为TRUE时表示使用窗口模式,为FASLE表示使用全屏模式

EnableAutoDepthStencil 表示 Direct3D 是否为应用程序自动管理深度缓存,若为TRUE,那么需要AutoDepthStencilFormat 成员指定深度缓冲的像素格式

 

FullScreen_RefreshRateInHz  表示当全屏模式时指定屏幕的刷新模式,在全屏模式下可以设为默认模式D3DPRESENT_RATE_DEFAULT,  在窗口模式下,要设为0

Flags 用于表示附加属性,通常可以设为 0:  而 PresentationInterval 成员用于指定平面的翻转模式,在窗口模式下 其值为0

 

 

设置好 D3DPRESENT_PARAMETERS 结构后,调用IDirect3D9接口的 CreateDeivce 方法创建IDirect3DDevice9 接口对象

 

 

Adapter  表示将创建的IDirect3DDevice9 接口对象所代表的显卡类型,可以为D3DDEVTYPE_HAL  D3DDEVTYPE_REF  D3DDEVTYPE_SW

BehaviorFlags 指定了 Direct3D 设备进行3D 运算的方式,通常为 D3DCREATE_HARDWARE_VERTEXPROCESSING或者 D3DCREATE_SOFTWARE_VERTEXPROCESSING  分别表示进行硬件顶点运算或 软件顶点运算

 

上面这些都是为绘图做的准备工作,创建 IDirect3D9 接口对象,然后围绕着接口对象 先获取设备信息判断是否支持硬件顶点运算,然后创建 IDirect3DDevice9 接口对象。

在这些准备工作做好之后,开始 Direct3D 图形绘制

计算机绘图的工作方式与电影放映其实十分类似,影片图像以帧为单位,以每秒24帧的速度连续播放,由于这些图像之间的差别十分小,以及人眼滞留作用,所有我们可以看到连续的动画。同理,计算机绘图,是通过每秒渲染 30 或更多的图像,产生动画的效果。Direct3D 使用了一种称为 交换链(Page Flipping)的技术让画面平滑的过渡。

对于 3D 图形,还需要一个深度信息,Direct3D 使用深度缓存为最终绘制的图像的每个像素存储一个深度信息。深度缓存只包含了特定像素的深度信息而不含图像数据的表面信息。

 

前台缓存和后台缓存是位于系统内存或显卡里的内存块,对应于将要显示的二维显示区域。前台缓冲区主要用于刷新屏幕,是用户可见的部分,后台缓冲区则主要用于图形的绘制,堆用户是不可见的。绘制完成后,两者进行交换链的页翻动的工作,把处理完的图形显示出来。

 

 

 

Direct3D 的绘制过程就是 : 绘制 ->显示 ->绘制 -> 显示。

每当开始绘制图形之前,都需要通过 IDirect3DDevice9 接口的 Clear 方法将后台缓存中的内容进行清空,并设置表面的填充颜色

 

 

 

pRects 用于指定堆表面指定的矩形区域进行清除操作,数组中包含的矩形的数量由Count 参数指定

Flags  指定需要清除的表面,该参数可以取值于 D3DCLEAR_TARGET D3DCLEAR_ZBUFFER D3DCLEAR_STENCIL, 分别表示对后台缓存、深度缓存和模板缓存进行清除

Color 参数用于指定在清除缓存内容后设置的背景色,可以通过 D3DCOLOR_XRGB 宏将 RGB值转换给该参数

Z参数用于指定当清除缓存内容后设置深度缓存的值,通常设为1.0f 而 Stencil参数则表示设置模板缓存的值,通常设为0

图形的实际绘制工作是在调用  IDirect3DDevice9 接口的 BeginScene 和 EndScene 方法之间进行的。调用 BeginScene  方法通知 Direct3D 设备开始进行图形渲染工作,而 EndScene 方法则通知Direct3D 设备结束图形渲染工作

 g_pd3dDevice->BeginScene();                     // 开始绘制

 

    /* 图形的实际绘制过程*/

 

    g_pd3dDevice->EndScene();                       // 结束绘制

绘制图形结束后,此时所有已绘制的内容将保存在后台缓存里,为了能够在屏幕上显示这些内容,就需要通知 Direct3D将后台缓存中的内容复制到前台缓存中。 IDirect3DDevice9 接口的 Present 方法 用于前台缓存与后台缓存之间的翻转

 

最后的收尾工作-------结束并清理对象资源

由于COM 接口对象是通过控制对它的引用计数器来决定声明周期的,所以当对某个COM 接口对象引用结束后,应用程序必须调用 Release 方法释放接口,而此时该对象的引用计数器减。如果最终引用计数器为,那么该对象占用的内存将被释放

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Direct3D是由Microsoft开发的一种图形API,用于在Windows平台上实现图形渲染功能。Direct3D的源代码是指Direct3D库的实现源代码,这些源代码涵盖了Direct3D的各种功能和算法。Direct3D源码是机密的,并且不可公开,只有经过授权的开发人员才能访问和使用。 Direct3D的源代码提供了对图形硬件的底层访问,开发人员可以使用这些源代码构建图形应用程序,并实现图形渲染、投影、纹理映射、光照等各种图形效果。Direct3D源代码包括了底层的图形操作、纹理管理、三维空间计算等算法,以及与硬件交互的接口。 Direct3D源代码的访问受到严格的控制,只有合作伙伴或授权的开发人员才能查看和修改它。这样可以保护Direct3D的安全性,防止源代码被滥用或恶意利用。通过合理授权和许可,开发人员可以获得Direct3D源代码的访问权,并根据自己的需要进行定制和优化。 Direct3D源代码的使用需要一定的专业知识和经验,开发人员需要熟悉图形编程和底层硬件操作的相关知识。通过研究和理解Direct3D源代码,开发人员可以深入了解Direct3D的工作原理,并开发出更高效、更强大的图形应用程序。 总之,Direct3D源代码是实现Direct3D功能的基础,它提供了底层的图形操作和算法实现。通过合法的授权和许可,开发人员可以使用Direct3D源代码进行图形应用程序的开发和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值