您的位置:首页 > 其它

DirectX模板技术解析基础一

2011-03-11 07:12 211 查看
作者:StrongCoding

邮箱:StrongCoding@qq.com DX群:130302441

若文中有误,请告知.十分感谢.一起加油.

一、预备知识:

1、涉及的相关概念区别:

(1) 后缓存又被称之为目标缓存,它是我们渲染数据到屏幕,事先存储数据的层;

(2) 深度缓存,是记录深度信息的数据层,往往和模板缓存掺杂在一起;

(3) 模板缓存,顾名思义就是用来保存模板值的。它的作用就是控制哪些像素被写入到后缓存中去,如果待测试的像素没有通过深度 测试函数,则意味着该像素无法写入到后缓存,也就意味着也不会写入到深度缓存中去。

2、模板缓存涉及的相关概念:

(1)参考值REF

Device->SetRenderState( D3DRS_STENCILREF, 0x1 );

作用:一个模板参考值。在我们程序中需要用到此变量作为缓存的入口比较位。在我们接下来的这个学习历程中,将这个参考值 作为一种比较标准。

(2)掩码值MASK

Device->SetRenderState( D3DRS_STENCILMASK, 0xFFFFFFFF );

作用:掩码人如其名,就是用来掩饰(掩盖可能更为恰当)REF和当前ValuePix中的位的。默认值是0xFFFFFFFF,表名不掩饰任 何像素位。

(3)写掩码值WRITEMASK

Device->SetRenderState( D3DRS_STENCILWRITEMASK, 0xFFFFFFFF );

作用:它将掩饰我们写入到模板缓存的任何像素位。

(4)更新模板

a、当模板测试失败的时候,我们不更新当前像素处的模板值

Device->SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP );

b、当深度测试失败的时候,我们不更新当前像素处的模板值

Device->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP );

c、当模板测试通过的时候,我们将设置我们的参考值作为模板值

Device->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE );

(5)模板比较函数

Device->SetRenderState( D3DRS_STENCILFUNC, ... );

作用:通过此比较函数,我们就可以比较当前像素与参考模板值之间的关系。以此,来决定是不是要将其写入到该模板缓存 中去。

(6)自行控制像素不得写入到后缓存,也就是不更新后缓存的手段(实际上不更新到后缓存,也就意味着我们不会看到图像的),技 术实现原理

Device->SetRenderState( D3DRS_ZWIRTEENABLE, FALSE );

// do somethings

Device-> SetRenderState( D3DRS_ZWIRTEENABLE, TRUE );

说明:正如你所看到的这样,我们只要在处理的时候,关闭深度写即可。

3、你需要明白的3D数学几何知识:

描述一个平面,我们只需要一个垂直于该平面的发现N和该平面上的一个点即可描述此平面。

公式:N*( P - Po ) = 0 ==> N*P +( -N*Po ) = 0 ==> N*P + d = 0 ==> d = -N * Po

|

|

V^ |Po V

|

|

|

|

|

|

说明:将向量V通过平面Plane,镜面映像形成的向量V^的距离等于 :V^ = V - 2( V - Po )

在D3D中,我们可以很简单的实现将V转换到V^图像。通过D3DXMaterixReflect( &MatrixOut, D3DXPLANE )实现.

此外还需要说明的一个东西是:D3DXPLANE,这个东西是D3D用来生成一个平面的快捷函数,我们只需要提供构造该平面的 x,y,z,d即可. d是个常数.

下面是构造平面D3DXPLANE的各个参数的示意:

XY的平面:0, 0, 1, 0

XZ的平面:0, 1, 0, 0

YZ的平面:1, 0, 0, 0

D3DXMatrixReflect函数的底层实现原理:

起始矩阵 XY平面 XZ平面 YZ平面

1 0 0 0 1 0 0 0 1 0 0 0 -1 0 0 0

0 1 0 0 0 1 0 0 0 -1 0 0 0 1 0 0

0 0 1 0 0 0 -1 0 0 0 1 0 0 0 1 0

0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1

要实现变换,你只要将两个矩阵乘起来,然后做这个变换即可.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: