网站大量收购独家精品文档,联系QQ:2885784924

遮罩是一項我們尚未討論過的高階繪製功能.docVIP

遮罩是一項我們尚未討論過的高階繪製功能.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
遮罩是一項我們尚未討論過的高階繪製功能

12. 屏蔽缓冲区 屏蔽是一项我们尚未讨论过的高阶绘制功能,这是一项在发展商业应用程序时很有用的技术。如果想让您的3D程序与众不同,最好能结合屏蔽以及前面学到的贴图技术。本章会详述如何运用屏蔽,并且展示能用它产生的不同类型效果。 市面上很多3D游戏和模拟都用电影级的特效添加戏剧性的冲击。您可以用屏蔽缓冲区来建立像合成、印花(decal)、溶入、淡出淡入(fade)、边框、剪影(silhouette)、刷抹(swipe)以及阴影等效果。屏蔽缓冲区能决定会绘制影像中的哪些像素。屏蔽缓冲区能让您针对各像素开启或关闭对绘制目的绘图页来达成这些功能。这表示您的软件可以「遮住」部份的影像让它不要显示。 当屏蔽功能启动时,Microsoft Direct3D会对要写入绘制目的绘图页的每个像素进行屏蔽测试。屏蔽测试会用一个屏蔽参考值、一个屏蔽板(stencil mask)、一个比较函式、以及一个取自屏蔽缓冲区的像素值(对应于目的绘图页中的现行像素)。下面是这个测试中所作的步骤: 用屏蔽板对屏蔽参考值作位AND运算。 用屏蔽板针对现行像素的屏蔽缓冲区值作位AND运算。 用比较函式比较步骤1和步骤2的结果。 控制比较函式、屏蔽板、屏蔽参考值、以及屏蔽测试通过或失败时的动作,就可以控制屏蔽缓冲区的运作。当测试成功时,现行像素会被写入目标。预设比较动作(D3DCMPFUNC列举类型所定义的D3DCMP_ALWAYS)不会管屏蔽缓冲区的内容而直接写入像素。您可以设定D3DRENDERSTATE_STENCILFUNC绘制状态并转入任一个D3DCMPFUNC成员值来改用任何所要的函式。 建立一个屏蔽缓冲区   在建立屏蔽缓冲区之前必须决定目标系统所支持的屏蔽功能。方法是呼叫IDirect3DDevice7::GetCaps方法。dwStencilCaps旗标表示装置所支持的屏蔽缓冲区运算。回报的旗标对全部三种屏蔽缓冲区运算都有效:D3DRENDERSTATE_STENCILFAIL、D3DRENDERSTATE_STENCILPASS以及D3DRENDERSTATE_STENCILZFAIL。Direct3D定义了下列的dwStencilCaps旗标: ?D3DSTENCILCAPS_DECR?表示有支持D3DSTENCILOP_DECR运算   ?D3DSTENCILCAPS_DECRSAT?表示有支持D3DSTENCILOP_DECRSAT 运算   ?D3DSTENCILCAPS_INCR?表示有支持D3DSTENCILOP_INCR 运算   ?D3DSTENCILCAPS_INCRSAT?表示有支持D3DSTENCILOP_INCRSAT运算   ?D3DSTENCILCAPS_INVERT?表示有支持D3DSTENCILOP_INVERT运算   ?D3DSTENCILCAPS_KEEP?表示有支持D3DSTENCILOP_KEEP运算   ?D3DSTENCILCAPS_REPLACE?表示有支持D3DSTENCILOP_REPLACE运算   ?D3DSTENCILCAPS_ZERO?表示有支持D3DSTENCILOP_ZERO 运算   Direct3D会用深度缓冲区数据来纪录屏蔽缓冲区信息。要找出目标系统的硬件支持哪些深度缓冲区及屏蔽缓冲区格式,可以呼叫IDirect3D7::EnumZBufferFormats方法,宣告如下: HRESULT IDirect3D7::EnumZBufferFormats ( REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, LPVOID lpContext ); 参数 说明 riidDevice 指向一个代表所要列举深度缓冲区格式的全域唯一辨别码(GUID)的参照 lpEnumCallback 指向D3DenumPixelFormatsCallback函式的地址,Direct3D 会对每个支持的深度缓冲区格式呼叫这个函式。 LpContext 由应用程序所定义并传入回传函式的数据 如果这个方法成功就会传回D3D_OK。如果失败就会传回以下四个值之一: DDERR_INVALIDOBJECT   DDERR_INVALIDPARAMS   DDERR_NOZBUFFERHW   DDERR_OUTOFMEMORY   下列程序会找出系统提供哪些屏蔽缓冲区以及支持哪些运算,然后建立一个屏蔽缓冲区。您可以看到,这段程序代码注明屏蔽缓冲区支持是否大于1位。如果只支持1位屏蔽缓冲区,某些屏蔽技术就得用不同的方法处理。 HRESULT CMyD3DApplication::CreateStencilBuffe

文档评论(0)

sunhao111 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档