【问题标题】:Rendering 2D image using Direct3D使用 Direct3D 渲染 2D 图像
【发布时间】:2017-08-29 13:34:11
【问题描述】:

我正在尝试用 Direct3D 替换我的 GDIPlus 渲染。我正在渲染一些订单的大图像(10K x 10K),GDI 变得非常慢。我现在正在使用 Direct3D 将图像作为纹理渲染到 Quad 上。图像确实会渲染,但是当图像缩小时,质量真的很差。

我正在使用以下过滤器。

m_pDevice3D->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pDevice3D->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
//m_pDevice3D->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 4);
m_pDevice3D->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

我已经尝试过使用各向异性滤镜进行渲染,但没有明显改善。

【问题讨论】:

  • 截图可能有帮助?

标签: winapi directx gdi+ direct3d direct2d


【解决方案1】:

如果不付出大量过滤的代价,就无法在小表面上渲染出高质量的大图像。

这是一个名为混叠的信号处理问题。要重现信号,您需要一种分辨率至少是两倍的介质,否则频谱会自行折叠。

在 3D 渲染中,典型的实现方式是生成 mipchain。它由图像的预过滤版本组成,将分辨率除以 2,直到我们达到 1x1 的大小。 GPU 然后能够选择正确的版本。

如果您的图像是动态的,并且您知道显示区域,您会更喜欢运行时过滤,但要使用 GPU 执行此操作,您必须使用带有着色器的最新直接 x 版本或使用临时离屏表面来进行乒乓球逐步减少。

【讨论】:

  • 嗨,我不是 direct3d 专家,你能告诉我什么是乒乓球表面吗?我该怎么做?我目前正在处理 cuda 解码示例,它工作正常,但文档说它没有优化,并且它说“为了获得最佳性能,请使用两个或更多 D3D9 表面在它们之间进行 ping/pong。这允许驱动程序在两者上工作无需等待即可解码和显示。”我搜索并找到了您的答案,但我仍然不知道这是什么乒乓球。
  • 乒乓球技术是许多系统的基石,例如渲染引擎中的后期处理。原理很简单,你有两个表面,从渲染目标到纹理交替使用,读取 A 和写入 B,然后读取 B 和写入 A,依此类推……对于原始海报,在一个独特的步骤中应用大高质量的放大,分步进行可能会简化问题(在这种情况下,如果你不想弄乱视口,你有一个不断增加的乒乓球表面链)
  • @Hamed 事情在年底有点忙,但这就是 SO 的目的 :) 另外,值得一提的是,乒乓球通常是必要的,因为你不会读写放置一个资源。这是真的,但对于计算着色器及其 RWBuffers 和 RWTextures 来说不再是这样了。
  • 我明白了,我今天就按你说的方法试试这个方法。我想我知道我现在应该做什么了。再次感谢!
  • 我按照你说的做了,现在效果好多了,谢谢你的帮助。
猜你喜欢
  • 2021-04-12
  • 2010-12-09
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多