DirectX11中Texture2D和Texture2DMS之间的区别

时间:2013-10-21 10:09:07

标签: directx textures directx-11 texture2d depth-buffer

我正在使用SharpDX,我想在Depth缓冲区中进行抗锯齿处理。我需要将深度缓冲区存储为纹理以便以后使用它。如果这个纹理是Texture2DMS,那么这是一个好主意吗?或者我应该采取另一种方法?

我真正想要实现的是:

1)深度缓冲区缩放

2)深度测试超级采样

(我在本文第3.2节中找到的术语:http://gfx.cs.princeton.edu/pubs/Cole_2010_TFM/cole_tfm_preprint.pdf

1 个答案:

答案 0 :(得分:1)

该论文要求深度预先通过。由于此过程不需要颜色,因此应将渲染目标保持为未绑定,并使用“空”像素着色器。对于深度,您应该创建一个Texture2D(而不是MS)2x或4x(或其他2Nx)您将要使用的最终渲染目标的宽度和高度。这不是真正的“超级采样”(因为预通过是一个没有实际像素输出的独立相位),但它是相似的。

对于第二阶段,本文要求从预通过中对高分辨率深度缓冲区进行多次采样。如果您按照上面的大小调整,每个像素将对应一些(2N)^ 2个深度值。您需要阅读这些值并对其进行平均。幸运的是,使用SampleCmp采样器类型的COMPARISON有一种硬件加速方式(称为PCF)。这会对2x2标记进行采样,将每个值与指定值进行比较(在此处传递第二阶段计算的深度,并且不要忘记添加一些epsilon值(例如1e-5)),并返回平均结果。执行2x2标记以覆盖与此像素关联的第一阶段深度缓冲区的整个区域,并对结果取平均值。最终结果表示当前线的脊柱对应于预通过的最前面深度。由于PCF的平滑过滤行为,当线条变得可见时,它们将慢慢淡入,与文中描述的别名“点线”效果相反。