【问题标题】:Difference between Texture2D and Texture2DMS in DirectX11DirectX11中Texture2D和Texture2DMS的区别
【发布时间】:2013-10-21 10:09:07
【问题描述】:

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

我真正想要实现的是:

1) 深度缓冲缩放

2) 深度测试超级采样

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

【问题讨论】:

  • 您能否澄清您在第 1 点和第 2 点中的意思? “缩放”是什么意思?关于超采样,MSAA 本质上总是超采样深度。
  • 我很难澄清这一点,因为我在一篇论文中看到了这一点,但我并不完全知道这意味着什么,我想这可能是一个常见的术语。我在第 3.2 节(可见性测试)的末尾找到了它:gfx.cs.princeton.edu/pubs/Cole_2010_TFM/cole_tfm_preprint.pdf
  • 您是否正在尝试实现论文中描述的线条渲染技术?如果是这样,请在您的问题文本中澄清这一点。如果不是,您尝试实现的渲染技术需要高于正常分辨率的深度缓冲区吗?
  • 是的,我是!但我认为这对于一个问题来说是一项艰巨的任务。它真的增加了问题吗?
  • 它确实有帮助,因为“这是一个好方法”需要最终目标的上下文,而且细节(1 和 2)太模糊,无法提供好的答案。

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


【解决方案1】:

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

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

【讨论】:

  • 我对如何渲染到纹理并将深度信息放在那里有点迷茫。您能否指出我可以帮助我的资源教程?我看过这个:rastertek.com/dx11tut22.html ... 看起来不错,但它渲染的是正常场景而不是深度。
  • @c4sh 并不是要为纹理渲染深度。相反,您正在使用 only 深度视图绑定进行标准渲染传递。这会导致深度写入正常,没有渲染颜色的开销。与渲染一次普通场景相同,只是不使用生成的渲染目标数据,但性能更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多