【问题标题】:Direct3D 9 Backbuffer samplingDirect3D 9 后缓冲采样
【发布时间】:2014-11-14 04:27:35
【问题描述】:

我在 direct3D 9 中锁定了后台缓冲区并将图像复制到其中。我注意到在一台计算机上,当图像被拉伸到屏幕上时,它会变得模糊。在我测试的另一台计算机上,它完全未经过滤(像素化)。有没有办法指定后台缓冲区是如何采样到屏幕上的,还是由其他东西控制的?

我试过了

Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);

但是没有效果;我认为它只会影响纹理。

【问题讨论】:

    标签: direct3d


    【解决方案1】:

    SetSamplerState 不会影响后台缓冲区如何绘制到屏幕上。 AFAIK 大多数驱动程序将使用点采样,这意味着像素会丢失或加倍,从而导致质量不佳。顺便说一句,机器上看起来正常的 GPU/驱动程序是什么(你不能/不应该到处依赖这种行为)?

    执行此操作的正确方法是将图像复制到纹理并渲染screen aligned quad,以便您可以使用硬件采样来为您平滑结果。

    如果由于某种原因无法使用纹理 + 渲染通道,则可以在复制到后台缓冲区时使用 IDirect3DDevice9::StretchRect 过滤图像。要真正从系统内存加载图像,您必须使用另一个表面,或者锁定并复制它,或者使用D3DXLoadSurfaceFromMemory

    【讨论】:

    • 平滑 backbuffer 的计算机有一个 NVidia GPU,而使其像素化的计算机是 ATI。我知道将纹理渲染到屏幕对齐的四边形更为典型,但出于各种原因我必须使用后缓冲区。如果驱动程序负责对后台缓冲区的采样方式而不是 Direct3D,那么我想我无法控制这一点,除非我更改后台缓冲区的大小。
    • 使用另一种过滤表面到表面副本的方法进行编辑。
    • StretchRect 似乎比锁定后缓冲区更快,它让我可以选择采样类型!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2010-12-07
    • 1970-01-01
    • 2018-11-17
    • 2011-09-05
    • 2022-11-21
    相关资源
    最近更新 更多