已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2 第9章模板缓冲区 模板缓冲区属于离屏缓冲区 通过模板缓冲区可以获得一些特效 模板缓冲区的构成和使用与后备缓冲区 深度缓冲区基本相似 模板缓冲区中的第i行第j列的像素也与后备缓冲区 深度缓冲区中相应位置的像素对应 主要目标 理解模板缓冲区的工作机制 了解如何创建和控制模板缓冲区 学习如何实现镜面效果 以及如何使用模板缓冲区来防止物体的影像被渲染到非镜面区域 了解如何渲染阴影 并通过模板缓冲区来防止 二次混合 3 9 1使用模板缓冲区 要启用模板缓冲区 需要将D3DRS STENCILENABLE渲染状态设置为true 如果想禁用模板缓冲区 只需将该状态设置为false 下面的代码展示了如何开启模板的渲染状态 Device SetRenderState D3DRS STENCILENABLE true 模板操作Device SetRenderState D3DRS STENCILENABLE false 4 9 1使用模板缓冲区 通过IDirect3DDevice9 Clear函数 可以将模板缓冲区中的所有元素清空为指定值 该函数还用于清除后备缓冲区以及深度缓冲区 Device Clear 0 0 D3DCLEAR TARGET D3DCLEAR ZBUFFER D3DCLEAR STENCIL 0 xff000000 1 0f 0 5 9 1 1获取模板缓冲区 在创建深度缓冲区的同时可以创建模板缓冲区 指定深度缓冲区格式的同时可以指定模板缓冲区的格式 表面缓冲区中每个像素的内存段被分割 用于描述不同的缓冲区 观察下面的3种深度 模板缓冲区格式 D3DFMT D24S8D3DFMT D24X4S4D3DFMT D15S1 6 8 1 2模板测试 由模板测试来决定特定像素是否要写入后备缓冲区 可以使用下面的公式来表示 ref mask ComparisonOperation value mask 当模板缓冲区处于开启状态时 对所有像素都要执行模板测试 它有两个操作数 左操作数 LHS ref mask 右操作数 RHS value mask 模板测试将通过所指定的比较操作对LHS和RHS参数进行比较 整个表达式的结果是一个布尔值 7 8 1 3模板测试的控制 1 模板参考值2 模板掩码3 模板值4 比较操作 8 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 9 1 5模板写入掩码 除了以上所述的渲染状态 还能设置写入掩码 用来屏蔽要写入到模板缓冲区中的值的某些位 写入掩码是由D3DRS STENCILWRITEMASK渲染状态所决定的 默认值为0 xffffffff 以下示范如何屏蔽高16位 Device SetRenderState D3DRS STENCILWRITEMASK 0 x0000ffff 10 9 2示例 镜子 在程序中实现镜子的功能需要解决两个问题 第一 必须知道如何求出对于一个任意表面的对称物体 然后才可以正确地画出反射的物体 第二 只能在镜子中显示反射的物体影像 也就是说 必须把某个表面标记为镜子 表明如果反射的物体影像位于镜子平面中才会对它进行渲染 第一个问题通过一些向量的几何知识来解决 使用模板缓冲区可以解决第二个问题 以下两个小节中将分别解释如何解决这两个问题 第三个小节将两个问题综合在一起 然后讨论本章的第一个简单例子 镜面效果 的相关代码 11 9 2 1镜面反射的相关数学知识 从图9 2中可知 对于任意平面的反射 注意k是点v到平面的最小有符号距离 由于点v在平面的正面 所以k是个正值 D3DX库中提供了下面这个函数来创建类似于R的反射矩阵 D3DXMATRIX D3DXMatrixReflect D3DXMATRIX pOut 返回反射矩阵CONSTD3DXPLANE pPlane 反射表面 12 9 2 2镜面效果的实现概述 下面简要地说明需要完成的步骤 1 像平常一样渲染整个场景 渲染地板 墙 镜子和茶壶 但是不渲染茶壶的影像 注意在这一步中并没有改变模板缓冲区 2 清空模板缓冲区并设置模板缓冲区为0 图9 3展示了当前的后备缓冲区和模板缓冲区 场景渲染到后备缓冲区后 将模板缓冲区清0 模板缓冲区中的浅灰色区域表示模板值为0 3 将构成镜子的图元单独渲染到模板缓冲区中 4 现在将茶壶的影像渲染到后备缓冲区和模板缓冲区中 13 9 2 3代码和解释 1 第一部分首先 开启模板缓冲区并设置相关的渲染状态 参见教材P1372 第二部分可以通过混合技术来阻止镜子渲染到后备缓冲区中 将源混合因子设置为D3DBLEND ZERO 目标混合因子设置为D3DBLEND ONE 将这些混合因子代入到混合等式中 就可以看到后备缓冲区的变化情况 参见教材P1383 第三部分开始准备渲染茶壶的影像 首先设置以下的渲染状态 Device SetRenderState D3DRS STENCILFUNC D3DCMP EQUAL Device SetRenderState D3DRS STENCILPASS D3DSTENCILOP KEEP 14 9 2 3代码和解释 4 第四部分RenderMirror函数中接下来的部分将计算反射矩阵 参见教材P1395 第五部分现在准备渲染茶壶的影像 可以通过清除深度缓冲区来实现 Device Clear 0 0 D3DCLEAR ZBUFFER 0 1 0f 0 15 9 2 3代码和解释 源像素代表茶壶的影像 目标像素代表镜子 可以从该等式中知道两者是如何混合在一起的 代码如下 Device SetRenderState D3DRS SRCBLEND D3DBLEND DESTCOLOR Device SetRenderState D3DRS DESTBLEND D3DBLEND ZERO 最后要做的是将茶壶的影像渲染出来 Device SetTransform D3DTS WORLD 16 9 2 3代码和解释 最后 关闭混合和模板缓冲区状态 恢复正常的后表面剪裁模式 Device SetRenderState D3DRS ALPHABLENDENABLE false Device SetRenderState D3DRS STENCILENABLE false Device SetRenderState D3DRS CULLMODE D3DCULL CCW RenderMirror 结束 17 9 3示例 平面阴影 阴影不仅能使我们可以感觉到光源在场景中的位置 而且可以增加场景的真实性 在本小节中将讨论如何实现平面阴影 也就是位于平面上的阴影 如图9 5所示 要实现平面阴影 必须首先找到物体在平面上的阴影 并将它几何模型化 然后才可以对阴影进行渲染 通过一些三维数学可以很轻松地得到这种模型 接着可以开始渲染描述阴影的多边形 设定这个多边形的材质为黑色 并带有50 透明度 18 9 3 1平行光阴影 图9 6展示了平行光产生的物体阴影 光线是从平行光源发出的 并通过顶点p 方向为L 是一组平行线 平行光源的光线表达式为 光线和面相交于点s 所有经过物体顶点的光线和平面相交的点集就组成物体阴影的几何形状 19 9 3 2点光源阴影 图9 7展示了点光源照射物体得到的阴影 L为光源顶点的位置 从点光源发出经过点的光线方程为 20 9 3 3阴影矩阵 可以使用一个变换矩阵来将点p变换到点在平面上的投影s 此外 可以用同样的矩阵来灵活地表示正交投影变换和透视投影变换 21 9 3 3阴影矩阵 D3DX库提供了用于建立阴影矩阵的函数 参数分别是平面位置 平行光的方向 w 0 或者点光源的位置 w 1 D3DXMATRIX D3DXMatrixShadow D3DXMATRIX pOut CONSTD3DXVECTOR4 pLight LCONSTD3DXPLANE pPlane 平面 22 9 3 4用模板缓冲区来防止二次混合 当使用透明 利用混合技术 来渲染阴影的时候 有的区域因为重叠的三角形多次混合而显得比其他的区域颜色更深 如图9 8所示 可以通过模板缓冲区来解决该问题 可以将模板测试设置为只接受第一次渲染的像素 也就是说 在向后备缓冲区中渲染阴影像素的同时标记出模板缓冲区中所对应的像素 23 9 3 5代码和解释 首先还是设置模板渲染状态 并将模板比较操作设置为D3DCMP EQUAL 将D3DRS STENCILREF渲染状态设置为0 x0 也就是指定只将阴影渲染到模板缓冲区中对应像素数值为0 x0的后备缓冲区 RenderShadow函数的代码开始部分如下 参见教材P145接着 计算阴影变换 并且将阴影平移到场景中的合适的位置 参见教材P145最后设置50 透明度的黑色材质 关闭深度测试 进行阴影渲染 接着重新打开深度测试并关闭Alpha混合和模板测试 24 9 4小结 模板缓冲区和深度缓冲区共享相同的表面 并同时被创建 使用D3DFORM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖南财信金融控股集团有限公司春季校园招聘笔试历年参考题库附带答案详解
- 2026湖北武汉城市公共设施运营管理集团有限公司招聘6人笔试历年参考题库附带答案详解
- 2026湖北十堰市房县风雅演艺有限公司演职人员招聘笔试核减及降低开考比例笔试历年参考题库附带答案详解
- 2026河南安阳殷都区医疗健康服务集团招聘合同制护理人员3人笔试历年参考题库附带答案详解
- 2026年中职法律实务技能大赛现场答辩环节试题
- 2026年武汉城市职业学院单招职业技能考试题库及答案解析
- 2026年事业单位考试逐题解析真题及答案
- 石油输送管道工程农用地转用方案
- 2026年交安考试题含答案解析
- 2026年河南信息统计职业学院单招职业适应性考试模拟测试卷带答案解析
- 2026年超星尔雅学习通《当代大学生国家安全教育》章节通关试题库及完整答案详解(有一套)
- 新版人教版八年级语文下册名著阅读理解能力测试卷(含试题及答案)
- 2026年上半年中学教师资格证综合素质真题及答案解析
- 2026化工和危险化学品生产经营企业重大生产安全事故隐患自查表
- 新华保险绩效考核制度
- 产品开发项目流程及执行规范
- 医疗器械经营质量管理规范自查报告
- 2025年中国美术学院中国近现代史纲要期末考试模拟题附答案
- 2025年中职(循环农业与再生资源利用)资源回收测试试题及答案
- Minitab混料设计课件
- 2025江苏苏州市健康养老产业发展集团有限公司下属子企业招聘4人(第五批)笔试历年备考题库附带答案详解试卷2套
评论
0/150
提交评论