direct3D学习笔记(2)

2019-03-09 20:49

缓冲区的东西就没有什么用了,可以丢弃(discard 是否丢弃由显卡决定,但不再等待)了。 (2)如果设定为D3DSWAPEFFECT_FLIP,后备缓冲拷贝到前台缓冲,保持后备缓冲内容不变。当后备缓冲大于1个时使用

(3)设定D3DSWAPEFFECT_COPY的话,后备缓冲拷贝到前台缓冲,保持后备缓冲内容不变。当后备缓冲等于1个时使用

一般我们是把这个参数设为D3DSWAPEFFECT_DISCARD。如果想使用GetBackBuffer 获得后备缓冲内容打印屏幕画面。则不能使用DISCARD.

很怀疑用DISCARD效率会好的说法。在我的8600GT 上_COPY 明显好于DISCARD. discard 做法是再次使用后备缓冲时 new 一个新的缓冲,旧的缓冲内容遗弃,如果还有使用旧的缓冲地方,不会影响新的内容,如使用抗锯齿必须是DISCARD。这样不用等待硬件同步。不过大部分是一次Present操作。用COPY在新机器上面反倒效率好些。毕竟new 一个 1440*900 的后台缓冲也是有消耗的。(对于DISCARD 做法仅仅是猜测。不同显卡可能不同。)

hDeviceWindow:显示设备输出窗口的句柄

Windowed:如果为FALSE,表示要渲染全屏。如果为TRUE,表示要渲染窗口。渲染全屏的时候,BackBufferWidth和BackBufferHeight的值就得符合显示模式中所设定的值。 EnableAutoDepthStencil:如果要使用深度缓冲,则把它设为TRUE。

AutoDepthStencilFormat:如果不使用深度缓冲,那么这个参数将没有用。如果启动了深度缓冲,那么这个参数将为深度缓冲设定缓冲格式。常用值D3DFMT_24S8 (24 深度缓冲,8模板缓冲),D3DFMT_24X8(24 深度缓冲),D3DFMT_16(16深度缓冲)等等。

//深度缓存和模板缓存的象素格式,如 D3DFMT_D24S8 , 24 位表示深度,8位为模板缓存。一般不会用到32位深度:D3DFMT_32

//注意如果设置模板缓冲在Clear() 函数中也要清楚模板缓冲:设置参数 D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL

Flags:通常为0 或D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。不太清楚是用来做什么的,看字面好像是一个能否锁定后备缓冲区的标记。D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL 丢弃模板缓冲区

FullScreen_RefreshRateInHz:显示器的刷新率,单位是HZ,如果设定了一个显示器不支持的刷新率,将会不能创建设备或发出警告信息。为了方便,一般设为D3DPRESENT_RATE_DEFAULT就行了。

PresentationInterval:如果设置为D3DPRENSENT_INTERVAL_DEFAULT,则说明在显示一个渲染画面的时候必要等候显示器刷新完一次屏幕。例如你的显示器刷新率设为80HZ的话,则一秒内你最多可以显示80个渲染画面。另外你也可以设置在显示器刷新一次屏幕的时

间内显示1到4个画面。如果设置为 D3DPRENSENT_INTERVAL_IMMEDIATE,则表示可以以实时的方式来显示渲染画面,虽然这样可以提高帧速(FPS),如果速度过快却会产生图像撕裂的情况,但当游戏完成时,帧速度一般不会过快。 //创建D3D设备接口: HRESULT CreateDevice ( UINT Adapter,

//显卡序列号

//所属窗口句柄

//设备进行3D 运算方式

D3DDEVTYPE DeviceType, //D3D 设备类型 HWND hFocusWindow, DWORD BehaviorFlags, 的指针

IDirect3DDevice9 ** ppReturnedDeviceInterface //返回D3D 设备接口指针的地址 );

第二个参数DeviceType 取值:

D3DDEVTYPE_HAL //硬件抽象层,通过显示硬件来完成图形渲染工作 D3DDEVTYPE_REF //参考光栅器,一般用于测试显卡不支持的D3D 功能 D3DDEVTYPE_SW //用于支持第三方软件 第四个参数BehaviorFlags 取值:

D3DCREATE_SOFTWARE_VERTEXPROCESSING //由D3D 软件进行顶点运算(常用) D3DCREATE_FPU_PRESERVE //激活双精度浮点运算或浮点运算异常检测,设置该项会降低系统性能

D3DCREATE_MULTITHREADED //保证D3D是多线程安全的,设置该项会降低系统性能 D3DCREATE_MIXED_VERTEXPROCESSING //由混合方式进行顶点运算 D3DCREATE_HARDWARE_VERTEXPROCESSING //由D3D硬件进行顶点运算

D3DCREATE_PUREDEVICE //禁用D3D 的Get*()函数,禁止D3D使用虚拟设备模拟顶点运算

//创建顶点缓冲区

HRESULT CreateVertexBuffer( UINT Length,

//顶点缓冲区的大小,按字节数算 //顶点缓冲区属性 //灵活顶点格式

DWORD Usage, DWORD FVF, D3DPOOL Pool,

D3DPRESENT_PARAMETERS *pPresentationParameters, //用于存储D3D 设备相关信息

//顶点缓冲区的内存类型

IDirect3DVertexBuffer9** ppVertexBuffer, );

//顶点缓冲区指针地址

HANDLE* pSharedHandle //保留参数,置为0

*Usage:参数Usage 用于指定顶点缓冲区的属性,其取值可以设为0,或下面任意值的组合。

D3DUSAGE_WRITEONLY //只写属性,不能进行读操作,设置该属性可以提高系统性能 D3DUSAGE_DYNAMIC //指定顶点缓冲区要求使用动态内存 D3DUSAGE_NPATCHES //使用顶点缓冲区绘制N-patches 曲线 D3DUSAGE_POINTS

//指定顶点缓冲区存储原始点

//使用软件进行顶点运算,否则使用硬件计

D3DUSAGE_RTPATCHES //使用顶点缓冲区绘制高阶图元(high-orderprimitive) D3DUSAGE_SOFTWAREPROCESSING 算

*Pool:参数Pool 属于枚举类型D3DPOOL,指定顶点缓冲区资源的内存位置,如下: typedef enum _D3DPOOL {

D3DPOOL_DEFAULT = 0,//默认值,顶点缓冲区尽可能存在于显存中

D3DPOOL_MANAGED = 1, //由D3D的资源管理器自动调度顶点缓冲区内存位置 D3DPOOL_SYSTEMMEM = 2, //顶点缓冲区位于内存中

D3DPOOL_SCRATCH = 3, //定点缓冲区位于计算机临时内存中,只能进行内存加锁拷贝 D3DPOOL_FORCE_DWORD = 0x7fffffff //强制将此ENUM 编译为32 位,无其他意义 } D3DPOOL;

//创建索引缓冲

HRESULT CreateIndexBuffer(

UINT Length, //索引缓冲区大小,按字节数计算 DWORD Usage, //索引缓冲区属性,和顶点缓冲区相同

D3DFORMAT Format, //索引数组的元素格式,可以是16 位或者32 位 D3DPOOL Pool, //索引缓冲区内存位置

IDirect3DIndexBuffer9** ppIndexBuffer, //索引缓冲区指针地址 HANDLE* pSharedHandle //保留参数,设为0 ); //保存顶点 HRESULT Lock(

UINT OffsetToLock, //加锁内存起始地址

UINT SizeToLock, //加锁内存大小 VOID **ppbData, //返回内存指针地址 DWORD Flags );

DWORD Flags:指定了顶点缓冲区的加锁属性,它可以取值为0,或者如下中的任意组合:

D3DLOCK_DISCARD //仅在动态缓冲区下使用,硬件丢弃原缓冲区并创建一个 新的缓冲区

D3DLOCK_NO_DIRTY_UPDATE //在缺省状态下,对缓冲区加锁将会在该区域设置一个Dirty 标志,该属性将不对该区域设置Dirty 标志

D3DLOCK_NOSYSLOCK //在加锁的过程中系统可进行其他操作 D3DLOCK_READONL

//设置缓冲区位只读属性

D3DLOCK_NOOVERWRITE //尽在动态缓冲区下使用,保证不覆盖缓冲区数据,即向缓冲区中添加数据,允许在渲染时添加数据到缓冲区

//加锁属性

3.消息循环

由peekmessage(),translatemessage(),dispatchmessage()三个函数组成,他们是windows标准消息循环处理过程,当应用程序消息队列有一个消息时,peekmessage()返回true,执行translatemessage()进行消息转换,最后由dispatchmessage()传递给窗口过程函数 BOOL PeekMessage(

LPMSG IpMsg, //接收消息信息的MSG结构指针 HWND hWnd,

//其消息被检查的窗口的句柄

UINT wMSGfilterMin, //指定被检查的消息范围里的第一个消息 UINT wMsgFilterMax, //指定被检查的消息范围里的最后一个消息 UINT wRemoveMsg );

wRemoveMsg可取下列值之一:

PM_NOREMOVE:PeekMessage处理后,消息不从队列里除掉。 PM_REMOVE:PeekMessage处理后,消息从队列里除掉。

可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。此标志使系统不释放等待调用程序空闲的线程。

缺省地,处理所有类型的消息。若只处理某些消息,指定一个或多个下列值: PM_QS_INPUT:Windows NT5.0和Windows 98:处理鼠标和键盘消息。

//确定消息如何被处理

PM_QS_PAINT:Windows NT 5.0和Windows 98:处理画图消息。

PM_QS_POSTMESSAGE:Windows NT 5.0和Windows 98:处理所有被寄送的消息,包括计时器和热键。

PM_QS_SENDMESSAGE:Windows NT 5.0和Windows 98:处理所有发送消息。 返回值:如果消息可得到,返回非零值;如果没有消息可得到,返回值是零

4.图形渲染

所有的渲染操作都必须在BeginScene()和EndScene()之间执行,最后Present()将后台缓冲区内容提交到前台缓冲区,大多数的三维程序都拥有两个或者两个以上的颜色缓冲区,用于当前屏幕刷新的为前台缓冲区,其他的用于图形绘制的颜色缓冲区成为后台缓冲区. HRESULT IDirect3DDevice9::Clear( DWORD Count, DWORD Flags, float z, );

Clear作用是:清空一个或者多个表面的内容,direct3d在绘制图形之前要调用它清除视口的颜色缓冲区、深度缓冲区、模版缓冲区中的一个或者多个。

//设置渲染状态

HRESULT SetRenderState(

D3DRENDERSTATETYPE State, //需要渲染的状态 DWORD Value );

改变D3D中的渲染状态(部分) 1). 设置着色模式:

SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT) //设置平面着色模式 SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD) //设置格劳德着色模式 2). 设置多边形填充模式:

SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT) //点填充模式,D3D在多边形的每个顶点绘制一个像素

SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME) //线填充模式,D3D在多边形

//设置的渲染状态的值

//重置的矩形区域数量

//重置缓冲区标志,//指定重置的缓冲区 //颜色值 //模板

const D3DRECT* pRects, //重置的矩形区域//数组指针 D3DCOLOR Color, DWORD stencil

//深度值,最远为1.0f最近为0


direct3D学习笔记(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:德镇市2013年八年级下期中试卷及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: