IDirect3DDevice9::Clear函数

来源:互联网 发布:python 股票回测系统 编辑:程序博客网 时间:2024/05/29 07:18

IDirect3DDevice9::Clear函数

发表于2014/11/6 15:02:01  2052人阅读

分类: DirectX

使用:Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00ff0000, 1.0f, 0);

作用:清除或设置后台缓存区颜色(部分或者整个视口), 指定台缓存区的ARGB颜色, 设置深度缓冲值, 并设置模板缓冲区的参考值.

详解:

HRESULT Clear(

// pRects 裁剪四边形的个数,pRects等于NULL时,Count是0;其它情况不能取0。
  [in]  DWORD Count,
// 是后台缓存用屏幕坐标来描述的四边形区域对象指针,所有区域是经过视口坐标系裁剪的(在视口内),0是整个后台缓存。
  [in]  const D3DRECT *pRects, 
// 一个或多个缓存,包括D3DCLEAR_TARGET(后台缓存), D3DCLEAR_ZBUFFER(Z深度缓存), D3DCLEAR_STENCIL(模板平面缓存)
//前台缓存不能操作(D3D应该只包括这些缓存)。a render target, all render targets in an MRT, a stencil buffer, or a depth buffer.
  [in]  DWORD Flags, 
// 设置成的颜色,是一个0x十六进制数,ARGB颜色,Alpha值0为全透明(0无东西),1是完成不透明(有遮挡的东西), 只对非底层图像有效?
  [in]  D3DCOLOR Color,
  [in]  float Z, // 深度缓存,[0,1]之间的浮点值,1是最远处(视体的最远边界),小于或等于这个Z初始值的Z值才会被改写。
  [in]  DWORD Stencil // 模板缓存,模板的参考值设置为0(值为[0,2n-1];其中n是模板缓冲的深度。描述模板缓存有比较函数,模板缓存中的参考值,比较用掩码,通过模板后的操作。

);


返回值:
If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be: D3DERR_INVALIDCALL.
失败:
Try to clear either the depth buffer or the stencil buffer of a render target(后台缓存) that does not have an attached depth buffer.

Try to clear the stencil buffer when the depth buffer does not contain stencil data(深度缓存需要包含模板缓存).

固定管道的渲染过程:



深度缓存,解决剔除(occlusion)问题,也就是说哪个面离相机最近,就显示。
像素的深度值越大,表明该像素离观察者越远。因此如果新象素的深度值dn小于老象素的深度值do,就表明它在老象素前面,新像素应该取代老象素。
在场景开始的时候,必须将深度缓冲区初始化为一个特定的值,通常初始化为 1.0,这是因为 1.0 是深度范围 0 到 1 的上限,它意味着在整个视体(viewing frustum)之内没有任何物体。


结果 z' 是在 -1 到 1 之间归一化之后的值,其中近距 near 平面位于 -1 处,远距 far 平面位于 1 处。在这个范围之外的相应点在视图体之外,不需要进行渲染。


Depth Buffer 与 Stencil Buffer,Color Buffer 并称 OpenGL 三大缓存。Depth Buffer 和 Stencil Buffer 也是 render buffer,
但与 Color Buffer 不同(RGBA四元组),它们均只有一个组成元素,Depth Buffer 只需要保存Z值,而 Stencil Buffer(模版缓存)
也只需要保存一个用于模版测试的值(后面会有文章介绍)。


但在 OpenGL 中渲染一个球时,前半球和后半球都会被渲染出来,这样就会出现前后两个半球上的x,
y相同只是z值不同两个点会被描绘到屏幕上的同一个像素上,先渲染的点会被后渲染的点给覆盖掉。
因此,如果前半球面上的点(Z值较小的那一个)先被渲染,随后后半球面上的点(Z值较大的那一个)被渲染,
会覆盖前半球面上的点,因而出现了上面那样的情况。解决这个问题的办法就是在渲染之前,对Z值进行比较,不渲染 Z 值较大的点。

在 OpenGL 中,这是通过 Depth Test 实现的,之所以叫做深度测试就是因为比较的是 Z 值 - 深度-从屏幕往里。

深度缓存中计算z值的公式:


far取1,near取-1,那么z' = 1/z, 当z越大那么z'越小,z越小z'越大,比较同一个深度缓存那么比较z'大小即可,取z'大的。

glClearStencil(0); // 初始为0

Clear the stencil buffer to this new value which ranges from 0 to 2n-1 (n is the bit depth of the stencil buffer). 

参考:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb174352(v=vs.85).asp

原创粉丝点击