第9章DirectX编程.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章DirectX编程

第9章 模板缓冲区 模板缓冲区属于离屏缓冲区,通过模板缓冲区可以获得一些特效。模板缓冲区的构成和使用与后备缓冲区、深度缓冲区基本相似,模板缓冲区中的第i行第j列的像素也与后备缓冲区、深度缓冲区中相应位置的像素对应。 主要目标: 理解模板缓冲区的工作机制,了解如何创建和控制模板缓冲区。 学习如何实现镜面效果,以及如何使用模板缓冲区来防止物体的影像被渲染到非镜面区域。 了解如何渲染阴影,并通过模板缓冲区来防止“二次混合”。 9.1 使用模板缓冲区 要启用模板缓冲区,需要将D3DRS_STENCILENABLE渲染状态设置为true。如果想禁用模板缓冲区,只需将该状态设置为false。下面的代码展示了如何开启模板的渲染状态: Device-SetRenderState(D3DRS_STENCILENABLE, true); ... // 模板操作 Device-SetRenderState(D3DRS_STENCILENABLE, false); 9.1 使用模板缓冲区 通过IDirect3DDevice9::Clear函数,可以将模板缓冲区中的所有元素清空为指定值,该函数还用于清除后备缓冲区以及深度缓冲区: Device-Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0xff000000, 1.0f, 0); 9.1.1 获取模板缓冲区 在创建深度缓冲区的同时可以创建模板缓冲区,指定深度缓冲区格式的同时可以指定模板缓冲区的格式。 表面缓冲区中每个像素的内存段被分割,用于描述不同的缓冲区,观察下面的3种深度/模板缓冲区格式: D3DFMT_D24S8 D3DFMT_D24X4S4 D3DFMT_D15S1 8.1.2 模板测试 由模板测试来决定特定像素是否要写入后备缓冲区,可以使用下面的公式来表示: (ref mask) ComparisonOperation (value mask) 当模板缓冲区处于开启状态时,对所有像素都要执行模板测试,它有两个操作数: 左操作数(LHS=refmask) 右操作数(RHS=valuemask) 模板测试将通过所指定的比较操作对LHS和RHS参数进行比较。整个表达式的结果是一个布尔值。 8.1.3 模板测试的控制 1. 模板参考值 2. 模板掩码 3. 模板值 4. 比较操作 9.1.4 更新模板缓冲区 除了能决定某个特定的像素是否要写入后备缓冲区之外,还可以根据以下3种情况来决定如何更新模板缓冲区。 (1) 当对第i行第j列的像素所进行的模板测试失败时,能通过设置D3DRS_ STENCILFAIL渲染状态来决定怎样更新模板缓冲区中的对应像素: Device-SetRenderState(D3DRS_STENCILFAIL, StencilOperation); (2) 当对第i行第j列的像素所进行的深度测试失败时,能通过设置D3DRS_ STENCILZFAIL渲染状态来决定怎样更新模板缓冲区中的对应像素: Device-SetRenderState(D3DRS_STENCILZFAIL, StencilOperation); (3) 当对第i行第j列的像素所进行的深度测试和模板测试都通过时,能通过设置D3DRS_STENCILPASS渲染状态来决定怎样更新模板缓冲区中的对应像素: Device-SetRenderState(D3DRS_STENCILPASS, StencilOperation); 9.1.5 模板写入掩码 除了以上所述的渲染状态,还能设置写入掩码,用来屏蔽要写入到模板缓冲区中的值的某些位。 写入掩码是由D3DRS_STENCILWRITEMASK渲染状态所决定的,默认值为0xffffffff,以下示范如何屏蔽高16位: Device-SetRenderState(D3DRS_STENCILWRITEMASK, 0x0000ffff); 9.2 示例:镜子 在程序中实现镜子的功能需要解决两个问题。 第一,必须知道如何求出对于一个任意表面的对称物体,然后才可以正确地画出反射的物体。 第二,只能在镜子中显示反射的物体影像。也就是说,必须把某个表面标记为镜子,表明如果反射的物体影像位于镜子平面中才会对它进行渲染。 第一个问题通过一些向量的几何知识来解决,使用模板缓冲区可以解决第二个问题。 以下两个小节中将分别解释如何解决这两个问题,第三个小节将两个问题综合在一起,然后讨论本章的第一个简单例子“镜面效果”的相关代码。 9.2.1 镜面反射的相关数学知识 从图9.2中可知,对于任意平面的反射,注意k是点v到平面的最小有符号距离,由于点v在平面的正

文档评论(0)

***** + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档