模版测试

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

D3D 中的模板缓存(1) 中的模板缓存( )
模板缓存是一个离屏缓存, 我们能够用它来完成一些特效。 模板缓存与后台缓存和深度缓存有相 同的定义, 因此在模板缓存中的像素与后台缓存和深度缓存中的像素是相协调的。 就象名字所说, 模板缓存就象一个模板它允许我们刷新渲染后缓存的某个部分。 举例,当要实现一个镜子时,我们只需要简单地反射一个物体细节到镜子平面上;然而, 我们仅仅想只绘制镜子里的反射结果。 我们能用模板缓存来渲染它, 8.1 清楚的显示了这一点。 图

模板缓存是 Direct3D 中的一小部分,它是通过一个简单的表面而被约束的。就象混合,这个简 单的表面提供了可变的强大的设置能力。 有效地学习使用模板缓存最好的方法是通过学习实际的 应用程序。 一旦你学懂了一点应用程序中的模板缓存, 你将会得到一个更好的用于你自己需要特 效的主意。 8.1 使用模板缓存
为了使用模板缓存,我们在初始化 Direct3D 时必须首先请求一个,然后必须启用它。为了启用 模板缓存,我们必须设置 D3DRS_STENCILENABLE 渲染状态并且指定它为 true(关闭它即可指 定为 false)。下面的代码是启用和关闭模板缓存的代码:
Device->SetRenderState(D3DRS_STENCILENABL E, true); ... // do stencil work Device->SetRenderState(D3DRS_STENCILENABL E, false);
我们可以使用 IDirect3DDevice9::Clear 方法来清除模板缓存并让其拥有默认值。回忆一下,同 样的方法被用在清除后缓存和深度缓存中。
Device->Clear(0, 0, D3DCLEAR_TARGET | D3D CLEAR_ZBUFFER | D3DCLEAR_STENCIL, 0xff00 0000, 1.0f, 0 );
注意我们已经添加了 D3DCLEAR_STENCIL 到第三个参数中, 它表示我们想把模板缓存和目标 (后 缓存)以及深度缓存一起清除。有 6 种值可以用来指定清除后的模板缓存;在这个例子中我们 将它清除为 0。

8.1.1 请求一个模板缓存
在我们创建深度缓存的同时一个模板缓存能够被创建。 当指定深度缓存格式的时候, 我们同时指 定模板缓存的格式。这样,模板缓存和深度缓存分享同一个离屏表面缓存,但是每个像素被指定 到各自缓存内存片段中。下面列出了 3 种深度/模板缓存的格式: D3DFMT_D24S8—这种格式是说创建一个 32 位深度/模板缓存,其中 24 位为深度缓存,8 位为 模板缓存。 D3DFMT_D24X4S4—这种格式是说创建一个 32 位深度/模板缓存,其中 24 位为深度缓存,4 位 为模板缓存,还有 4 位留着不用。 D3DFMT_D15S1—这种格式是说创建一个 16 位深度/模板缓存,其中 15 位为深度缓存,1 位为 模板缓存。 注意,还有一些格式没有分配任何位给模板缓存。例如,D3DFMT_D32 格式是说只创建一个 32 位深度缓存。 同样,不同硬件对模板缓存的支持也是不同的。例如有些显卡就不支持 8 位模板缓存。
8.1.2 模板测试
如前所述,我们能够使用模板缓存来阻止渲染后缓存中的某些部分。阻止特殊像素被写是 通过模板测试(stencil test)来决定的,这是通过下面的表达式来完成的:
(ref & mask) ComparisonOperation (value & m ask)
模板测试是对每个像素进行的,假设模板是被允许。将有两个操作: 左手边操作数(LHS=ref&mask) 右手边操作数(RHS=value&mask) 模板测试比较 LHS 和 RHS,通过比较运算来指定。全部的运算都得到一个布尔值(true/false)。 假如测试的结果是 true,那么我们把像素写入后缓存。假如测试的结果是 false,我们就阻止像素 被写入后缓存。当然,如果像素不能被写入后缓存,那么它也不能被写入深度缓存。

8.1.3 控制模板测试
Direct3D 允许我们控制变量用于模板测试。换句话说,我们可以指定参考值(stencil refe rence)和掩码(mask value),以便进行比较运算。虽然我们不能明确地设定模板值(stencil va lue),但是我们能够控制写入模板缓存的值。
8.1.3.1 模板参考值(Reference Value) 模板参考值( )
模板参考值 ref 的默认值为 0,但是我们能够通过设置 D3DRS_STENCILREF 渲染状态来改变它。 例如,下面的代码就是设置模板参考值为 1:
Device->SetRenderState(D3DRS_STENCILREF, 0 x1);
注意我们往往使用 16 进制,因为这让它看起来比整数更容易象一个位队列,并且当我们做位操 作时这样看起来更有用,比如相加。
8.1.3.2 模板掩码
模板掩码值 mask 是被用来掩饰(隐藏)在 ref 和 value 变量中的位。它的默认值是 0xffffffff, 也就是没有掩饰任何位。我们能够通过设置 D3DRS_STENCILMASK 渲染状态来改变它。下面的 例子就是掩饰高 16 位:
Device->SetRenderState(D3DRS_STENCILMASK, 0x0000ffff);
8.1.3.3 模板值(Stencil Value) 模板值( )

假如我们对第 i 行第 j 列的像素进行模板测试, 那么该值将被写入第 i 行第 j 列的模板缓存。 我们 不能明确地设置个别模板值, 但是可以清除模板缓存。 我们能够使用模板渲染状态来控制将什么 写入模板缓存。
8.1.3.4 比较运算
我们能够通过设置 D3DRS_STENCILFUNC 渲染状态来设置比较运算。这个比较运算能够被 D3D CMPFUNC 的任何成员类型列举:
typedef enum _D3DCMPFUNC { D3DCMP_NEVER = 1, D3DCMP_LESS = 2, D3DCMP_EQUAL = 3, D3DCMP_LESSEQUAL = 4, D3DCMP_GREATER = 5, D3DCMP_NOTEQUAL = 6, D3DCMP_GREATEREQUAL = 7, D3DCMP_ALWAYS = 8, D3DCMP_FORCE_DWORD = 0x7fffffff } D3DCMPFUNC;
D3DCMP_NEVER——模板测试永不成功。 D3DCMP_LESS——假如 LHS < RHS,那么模板测试成功。 D3DCMP_EQUAL——假如 LHS = RHS,那么模板测试成功。

相关文档
最新文档