欢迎来到天天文库
浏览记录
ID:51588252
大小:754.50 KB
页数:24页
时间:2020-03-24
《清华大学DirectX游戏编程第9章(全20章).ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第9章模板缓冲区模板缓冲区属于离屏缓冲区,通过模板缓冲区可以获得一些特效。模板缓冲区的构成和使用与后备缓冲区、深度缓冲区基本相似,模板缓冲区中的第i行第j列的像素也与后备缓冲区、深度缓冲区中相应位置的像素对应。主要目标:理解模板缓冲区的工作机制,了解如何创建和控制模板缓冲区。学习如何实现镜面效果,以及如何使用模板缓冲区来防止物体的影像被渲染到非镜面区域。了解如何渲染阴影,并通过模板缓冲区来防止“二次混合”。29.1使用模板缓冲区要启用模板缓冲区,需要将D3DRS_STENCILENABLE渲染状态设置为true。如果想禁用模板缓冲区,只需将该状
2、态设置为false。下面的代码展示了如何开启模板的渲染状态:Device->SetRenderState(D3DRS_STENCILENABLE,true);...//模板操作Device->SetRenderState(D3DRS_STENCILENABLE,false);39.1使用模板缓冲区通过IDirect3DDevice9::Clear函数,可以将模板缓冲区中的所有元素清空为指定值,该函数还用于清除后备缓冲区以及深度缓冲区:Device->Clear(0,0,D3DCLEAR_TARGET
3、D3DCLEAR_ZBUFFER
4、D3DCL
5、EAR_STENCIL,0xff000000,1.0f,0);49.1.1获取模板缓冲区在创建深度缓冲区的同时可以创建模板缓冲区,指定深度缓冲区格式的同时可以指定模板缓冲区的格式。表面缓冲区中每个像素的内存段被分割,用于描述不同的缓冲区,观察下面的3种深度/模板缓冲区格式:D3DFMT_D24S8D3DFMT_D24X4S4D3DFMT_D15S158.1.2模板测试由模板测试来决定特定像素是否要写入后备缓冲区,可以使用下面的公式来表示:(ref&mask)ComparisonOperation(value&mask)当模板缓冲区处于开启状态时
6、,对所有像素都要执行模板测试,它有两个操作数:左操作数(LHS=ref&mask)右操作数(RHS=value&mask)模板测试将通过所指定的比较操作对LHS和RHS参数进行比较。整个表达式的结果是一个布尔值。68.1.3模板测试的控制1.模板参考值2.模板掩码3.模板值4.比较操作79.1.4更新模板缓冲区除了能决定某个特定的像素是否要写入后备缓冲区之外,还可以根据以下3种情况来决定如何更新模板缓冲区。(1)当对第i行第j列的像素所进行的模板测试失败时,能通过设置D3DRS_STENCILFAIL渲染状态来决定怎样更新模板缓冲区中的对应像素
7、:Device->SetRenderState(D3DRS_STENCILFAIL,StencilOperation);(2)当对第i行第j列的像素所进行的深度测试失败时,能通过设置D3DRS_STENCILZFAIL渲染状态来决定怎样更新模板缓冲区中的对应像素:Device->SetRenderState(D3DRS_STENCILZFAIL,StencilOperation);(3)当对第i行第j列的像素所进行的深度测试和模板测试都通过时,能通过设置D3DRS_STENCILPASS渲染状态来决定怎样更新模板缓冲区中的对应像素:Device
8、->SetRenderState(D3DRS_STENCILPASS,StencilOperation);89.1.5模板写入掩码除了以上所述的渲染状态,还能设置写入掩码,用来屏蔽要写入到模板缓冲区中的值的某些位。写入掩码是由D3DRS_STENCILWRITEMASK渲染状态所决定的,默认值为0xffffffff,以下示范如何屏蔽高16位:Device->SetRenderState(D3DRS_STENCILWRITEMASK,0x0000ffff);99.2示例:镜子在程序中实现镜子的功能需要解决两个问题。第一,必须知道如何求出对于一个任
9、意表面的对称物体,然后才可以正确地画出反射的物体。第二,只能在镜子中显示反射的物体影像。也就是说,必须把某个表面标记为镜子,表明如果反射的物体影像位于镜子平面中才会对它进行渲染。第一个问题通过一些向量的几何知识来解决,使用模板缓冲区可以解决第二个问题。以下两个小节中将分别解释如何解决这两个问题,第三个小节将两个问题综合在一起,然后讨论本章的第一个简单例子“镜面效果”的相关代码。109.2.1镜面反射的相关数学知识从图9.2中可知,对于任意平面的反射,注意k是点v到平面的最小有符号距离,由于点v在平面的正面,所以k是个正值。D3DX库中提供了下面
10、这个函数来创建类似于R的反射矩阵:D3DXMATRIX*D3DXMatrixReflect(D3DXMATRIX*pOut,//返回反射矩阵CONST
此文档下载收益归作者所有