缓冲区的东西就没有什么用了,可以丢弃(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