2011-05-31 71 views
1

我试图使用ID3D11Texture2D上的模板缓冲将一个纹理的一部分覆盖在另一个纹理上。我打算通过在模板缓冲区上绘制所需的形状然后复制纹理来完成此操作。请为2D纹理的示例代码提供一些很好的教程,以了解模板缓冲区的用法。 (或者这样的一些替代方式)在Direct3D中使用模板缓冲

+0

请一些人给我一个链接,使用'模板Buffer'的'Direct3D'一个很好的教程有一些基本的例子一样掩蔽像素。 – 2011-05-31 12:29:40

回答

13

模板掩模101:

  • 所有主流的GPU使用8位模板缓冲,以及它们被设置到深度缓冲区,所以你必须选择一个缓冲格式包括模板(D24S8主要)
  • 清除深度和模板都为每帧的开头,以避免帧间的性能问题*(参见下面的注释)
  • 除非你知道自己在做什么,用0xFF的用于读取和写掩码在任何时候。
  • 出于性能方面的考虑,不会做模版读取测试
  • 出于性能的考虑,当启用深度写作,如果可能的话,保持模板读限于== 0和!= 0的测试,并清零
  • 如果您使用的是D3D9,您可以使用剪刀矩形和清除模板缓冲区,这比手动渲染四边形以将缓冲区设置回零快很多。
  • 无法在着色器中访问模板信息,所以后处理效果无法确定相邻像素的模板状态,而不将遮罩置于正常的渲染目标中并作为纹理进行采样。
  • 模版缓冲器值可以从下面的条件进行修改:
    1. 模版测试失败
    2. 深度测试失败
    3. 的模板及深度测试均通过
  • 无论条件是首先确定该动作可以是
    1. 保留(仅留下模板值)
    2. 替换
    3. 增量(添加1至当前缓冲区)
    4. 递减(从模版缓冲器子1)
    5. 零(与“stencilref”值来替换模板值)(直接零设置的值,当其他条件之一需要使用当前stencilref值)

*不遵守大多数这些规则通常会导致最坏的情况下模具性能非常有用:您的像素着色器执行每个像素,而不是为模板蒙版像素执行提前拒绝。此外,在较旧的Geforce卡上,这也可能导致所有后续绘制调用的早期深度拒绝的破坏,直到下一个帧或深度缓冲区模板被清除后才会被修复。

模板面具其实是很容易产生:

  • 清除模板缓存
  • (与stencilref 1或代替“保持”增量'替换')启用模板编写模板状态
  • 绘制一个多边形。需要注意的是,在着色器使用“取消”将防止更新模板,这是你如何载入纹理到模板缓存(但只作为一个二元掩模)

  • 禁用模板写,使模板测试

  • (理想情况下)也关闭深度写入
  • 画出你的效果,需要模板掩蔽
+0

谢谢,如果您可以给我一些代码示例,说明如何在D3D11中使用模板缓冲区来实现一些基本效果,那么这将非常有用。 – 2011-06-21 05:43:09