【问题标题】:Stretch blit in DirectX results in jagged edgesDirectX 中的 Stretch blit 导致锯齿状边缘
【发布时间】:2009-12-21 14:19:57
【问题描述】:

我有一个 Direct3D 应用程序,它以固定分辨率(例如 800x600)运行窗口或全屏。为了支持宽屏模式,我以 800x600 渲染到后缓冲区,然后使用 Blt 将最后一帧绘制到前缓冲区的一部分中,该部分通常更大(比如 1280x720),因此 800x600 图像被拉伸到 960x720 以保持纵横比。

这工作正常,除了在某些视频卡/操作系统/驱动程序组合(nVidia Quadro、DX11、Windows 7)中,blit 似乎是使用点采样完成的,从而导致锯齿状边缘和通常不平滑的最终图像。

有什么办法可以避免这种情况吗?例如,在放大时强制 Blt 使用线性滤波器?

(注意:我知道我可以将原始 800x600 资源渲染为 960x720,而不是在最后进行拉伸,但这还有其他缺点,因此在最后进行拉伸是首选解决方案)

【问题讨论】:

  • 我很想知道这些缺点是什么,因为我相信你最好正确地做而不是像上面那样做黑客。至少你所有的 3D 渲染看起来都是正确的......

标签: directx direct3d directdraw


【解决方案1】:

我认为没有任何方法可以控制这一点。我读到一些东西说这种行为在 windows7 中通过一些驱动程序发生了变化,但我现在找不到参考。

您也许可以渲染到 800x600 的纹理,然后在实际屏幕尺寸下使用此纹理绘制一个全屏四边形。那么至少你可以控制过滤。

【讨论】:

    【解决方案2】:

    您是否考虑过将场景渲染为纹理,然后将该纹理渲染到拉伸后的缓冲区?这会让你感到沮丧。

    它在某些机器上工作的原因是这正​​是驱动程序实现 blit 的方式

    不过,为了获得最佳效果,您真的最好只渲染到适当大小的后备缓冲区。即,如果您想要 1280x720 ... 渲染到 1280x720 的后台缓冲区,并进行适当的视野和纵横比修改。

    【讨论】:

    • 是的,我几天前做了渲染到纹理,它工作正常。我渲染到一个 800x600 的目标,然后拉伸最后的四边形,但是 - 直接渲染到最终大小的缓冲区还有其他问题,正如我在原始帖子中评论的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2019-04-30
    • 2014-05-18
    • 2019-07-22
    相关资源
    最近更新 更多