DirectX模板技术解析基础一

作者: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

 

 

实现变换,你只要将两个矩阵乘起来,然后做这个变换即可.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值