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()会导致视频内存表面丢失。
答案 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上并非如此。我不确定这两个平台的处理方式有何不同。