我试图使用ID3D11Texture2D
上的模板缓冲将一个纹理的一部分覆盖在另一个纹理上。我打算通过在模板缓冲区上绘制所需的形状然后复制纹理来完成此操作。请为2D纹理的示例代码提供一些很好的教程,以了解模板缓冲区的用法。 (或者这样的一些替代方式)在Direct3D中使用模板缓冲
1
A
回答
13
模板掩模101:
- 所有主流的GPU使用8位模板缓冲,以及它们被设置到深度缓冲区,所以你必须选择一个缓冲格式包括模板(D24S8主要)
- 清除深度和模板都为每帧的开头,以避免帧间的性能问题*(参见下面的注释)
- 除非你知道自己在做什么,用0xFF的用于读取和写掩码在任何时候。
- 出于性能方面的考虑,不会做模版读取测试
- 出于性能的考虑,当启用深度写作,如果可能的话,保持模板读限于== 0和!= 0的测试,并清零
- 如果您使用的是D3D9,您可以使用剪刀矩形和清除模板缓冲区,这比手动渲染四边形以将缓冲区设置回零快很多。
- 无法在着色器中访问模板信息,所以后处理效果无法确定相邻像素的模板状态,而不将遮罩置于正常的渲染目标中并作为纹理进行采样。
- 模版缓冲器值可以从下面的条件进行修改:
- 模版测试失败
- 深度测试失败
- 的模板及深度测试均通过
- 无论条件是首先确定该动作可以是
- 保留(仅留下模板值)
- 替换
- 增量(添加1至当前缓冲区)
- 递减(从模版缓冲器子1)
- 零(与“stencilref”值来替换模板值)(直接零设置的值,当其他条件之一需要使用当前stencilref值)
*不遵守大多数这些规则通常会导致最坏的情况下模具性能非常有用:您的像素着色器执行每个像素,而不是为模板蒙版像素执行提前拒绝。此外,在较旧的Geforce卡上,这也可能导致所有后续绘制调用的早期深度拒绝的破坏,直到下一个帧或深度缓冲区模板被清除后才会被修复。
模板面具其实是很容易产生:
- 清除模板缓存
- (与stencilref 1或代替“保持”增量'替换')启用模板编写模板状态
绘制一个多边形。需要注意的是,在着色器使用“取消”将防止更新模板,这是你如何载入纹理到模板缓存(但只作为一个二元掩模)
禁用模板写,使模板测试
- (理想情况下)也关闭深度写入
- 画出你的效果,需要模板掩蔽
+0
谢谢,如果您可以给我一些代码示例,说明如何在D3D11中使用模板缓冲区来实现一些基本效果,那么这将非常有用。 – 2011-06-21 05:43:09
相关问题
- 1. 在iOS中使用模板缓冲区
- 2. 缓冲direct3d绘制操作
- 3. 模板缓冲区在OpenGL
- 4. OpenTK模板缓冲区
- 5. PHP模板循环缓冲
- 6. 如何在食人魔中使用模板缓冲区掩码?
- 7. 用模板缓冲区绘制文本
- 8. 如何使用Managed Direct3D检查32位z缓冲区?
- 9. 在Direct3D中与顶点和索引缓冲区挣扎
- 10. 将模板缓冲区模糊到颜色缓冲区中。可能吗?
- 11. OpenGL模板缓冲区OR操作?
- 12. Libgdx模板缓冲区重叠
- 13. 模板缓冲区VS原始镶嵌
- 14. OpenGl:模板缓冲区问题(Wall + Window)?
- 15. 模板缓冲区读/写掩码
- 16. 在SlimDX传递参数给定缓冲区的Direct3D 11
- 17. 如何从Direct3D 11中的CPU访问帧缓冲区?
- 18. PHP样输出缓冲(让子模板影响主模板)
- 19. 在iOs中使用Open GL 1.0模板缓冲区进行屏蔽问题
- 20. 如何在OpenGL ES 2.0中使用模板缓冲区创建FBO?
- 21. 在OpenGL中更新模板缓冲区时的问题
- 22. Direct3d顶点缓冲区使用类型,性能和C++放大器?
- 23. Direct3D C++ api如何更新顶点缓冲区?
- 24. Managed Direct3D:锁定整个顶点缓冲区
- 25. 在Emacs中使用js2模式缓冲区的正确缩进
- 26. 双面缓冲不适用于面板?
- 27. 食人魔和快板direct3d设备9冲突
- 28. 在jQuery模板中使用KnockoutJS模板
- 29. 在模板中使用模板 - eclipse
- 30. 在Django模板中命名冲突
请一些人给我一个链接,使用'模板Buffer'的'Direct3D'一个很好的教程有一些基本的例子一样掩蔽像素。 – 2011-05-31 12:29:40