c++ - 当从 DirectX BackBuffer 拉伸(stretch)到 WIndow 时,Windows 使用点采样

标签 c++ directx directx-9

Windows7 使用点过滤从我的 DirectX9 后台缓冲区延伸到窗口客户区。调整窗口大小时,拉伸(stretch)产生的瑕疵看起来非常糟糕。我们可以通过更改后台缓冲区大小来避免这种情况,但这需要调用 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 后台缓冲区拉伸(stretch)到窗口。然而,他们的拉伸(stretch)似乎没有执行任何过滤。

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

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

最佳答案

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

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

1) 使后备缓冲区变大(您期望窗口的最大尺寸)-> 我选择了屏幕尺寸

2) 只绘制一个与窗口大小相等的矩形

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

我是 directX 的新手,但这个解决方案适合我。

关于c++ - 当从 DirectX BackBuffer 拉伸(stretch)到 WIndow 时,Windows 使用点采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462928/

相关文章:

c++ - 从不同机器同时调用 CreateDirectory 或 CreateFile 时会发生什么?

c++ - 关于 Direct2D 绘图调用中的多线程

c++ - d3d9.h 是否包含 windows.h? (C++)

c++ - 如何在 DirectX 9 中使用 D3DXSprite 尽可能快地绘制 D3DXFont?

c++ - 如何将此数学方程式写入 C++

php - 更新选择框值的 JavaScript 或 Qt 方式?

directx - 球体纹理映射错误

directx - DirectX 11 相当于 DirectX 9 的 D3DCAPS9::MaxVertexIndex 是什么

c++ - directx 教程 C++

c++ - 为什么 "template<class T> void f(T& t)"可以覆盖 T 中的函数而 "template<class T> void f(T t)"不能?