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
要实现变换,你只要将两个矩阵乘起来,然后做这个变换即可.
邮箱: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
要实现变换,你只要将两个矩阵乘起来,然后做这个变换即可.
相关文章推荐
- DirectX模板技术解析基础二
- DirectX模板技术解析基础三
- DirectX 3D_基础之融合技术 融合因子 透明度 Alpha通道 模板缓存 模板缓存的使用 模板测试
- Ajax基础必读:AJAX中的一些关键技术(解析xml的封装类,以及操纵DOM对象)
- 小博老师解析Java核心技术 ——JSwing窗体编程基础
- 【自动化测试技术QTP基础系列十】---脚本模板
- RAID技术基础知识解析
- D语言游戏编程(11):D语言基础之模板和混入(mixin)技术
- AllJoyn开源技术基础概念解析
- 深入解析php模板技术原理【一】
- TensorFlow技术解析与实战 4 基础知识
- 【数学基础】【欧拉函数解析模板】【欧拉筛法实现求1~n】【求单个n】
- [IT168]解析RAID技术基础知识及应用
- 路由技术的基础知识 路由基础概念解析说明
- 爬虫技术 -- 基础学习(六)解析相对地址
- Android中直播视频技术探究之---基础核心类ByteBuffer解析
- 现代前端技术解析:Web前端技术基础
- 四、模板使用的基础技术(Tricky Basics)
- Smarty模板技术基础知识
- 小博老师解析Java核心技术 ——JSwing窗体编程基础