从DirectX BackBuffer延伸到WIndow时,Windows使用Point采样

时间:2012-07-13 01:25:01

标签: c++ directx directx-9

Windows7正在使用点过滤从我的DirectX9后台缓冲区扩展到窗口客户区。调整窗口大小时,拉伸时的工件看起来非常糟糕。我们可以通过更改后台缓冲区大小来避免这种情况,但这需要调用IDirect3DDevice9 :: Reset()。当调整大小时,这会导致黑屏和小延迟。

有没有办法改进windows使用的过滤方法?或者,有没有办法从不同的DirectX表面更新窗口,如渲染目标?


我正在使用非托管C ++ DirectX代码。假设我有一个1280 x 720的缓冲区表面:

D3DPRESENT_PARAMETERS  presentParams;
presentParams.BackBufferWidth  = 1280;
presentParams.BackBufferHeight = 720;
gD3D->CreateDevice(
    0, D3DDEVTYPE_HAL, hWnd,               
    D3DCREATE_HARDWARE_VERTEXPROCESSING,
    &presentParams,
    &pD3D9Device);

然而我有一个1920 x 1080的窗口:

hWnd = CreateWindowExA(NULL, "WindowClass", winName,
                flags, 0, 0, 1920, 1080,
                NULL, NULL, hInstance, NULL);

当我调用Present()时,窗口会将我的DirectX后台缓冲区拉伸到窗口。然而,它们的伸展似乎不会执行任何过滤。

pD3D9Device->Present(NULL, NULL, NULL, NULL);

我可以调整后备缓冲区的大小,但这需要调用Reset()和Reset()会导致视频内存表面丢失。

3 个答案:

答案 0 :(得分:1)

当我尝试在窗口中播放视频时,我遇到了这个问题,并且想要在不需要重置设备的情况下调整窗口大小。

我找到了mpc-hc源代码的解决方案:https://github.com/mpc-hc/mpc-hc/blob/develop/src/filters/renderer/VideoRenderers/SyncRenderer.cpp

1)使backbuffer变大(你期望窗口的最大尺寸) - >我选择了屏幕尺寸

2)仅在尺寸等于窗口

的矩形上绘制

3)使用Device.Present(srcrect,destrect)。 srcrect和destrect是相同的矩形,是窗口大小。

我是directX和all的新手,但这个解决方案对我有用。

答案 1 :(得分:0)

如果您发布了一些您要询问的特定操作的代码片段会很有帮助,但是如果您使用的是GDI(Unmanaged Win32)StretchBlt函数,则可以使用HALFTONE获得更好的调整大小行为,如此帖子所示:Is StretchBlt HALFTONE == BILINEAR for all scaling?

如果您正在使用GDI +(WinForms / C#),您可以使用g.InterpolationMode = InterpolationMode.Bilinear进行双线性(或更好)插值(查看所有选项的MSDN)。请注意,GDI +通常比GDI(或DX)慢

(这篇文章中的一些相关信息:Bilinear interpolation - DirectX vs. GDI+

答案 2 :(得分:0)

您是否尝试过IDirect3DDevice9 :: SetSamplerState?

http://msdn.microsoft.com/en-us/library/windows/desktop/bb174698(v=vs.85).aspx

其实我在寻找类似的问题。我使用D3D9纹理来渲染一些图像。在Vista上,SetSamplerState加上线性纹理过滤有助于减少因大量调整窗口大小而导致的伪影。但在Windows7上并非如此。我不确定这两个平台的处理方式有何不同。