【发布时间】:2012-07-12 20:35:41
【问题描述】:
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() 会导致视频内存表面丢失。
【问题讨论】:
-
我删除了
windows和windows-7标签,因为它们毫无意义。问题是关于DirectX9,这显然是特定于 Windows 的,DirectX正在进行采样/渲染,而不是 Windows 本身(如果 Windows 这样做,你就不需要 DirectX)。 -
Windows 只是对窗口进行拉伸 blt(渲染后)。
-
通常的做法是让后台缓冲区和窗口大小相同——如果不能改变缓冲区,就改变窗口。我认为 DirectX 正在使用最快的方式将图像显示到窗口,这不涉及过滤。您可以通过使缓冲区成为窗口大小的整数除法来最小化失真。
-
是的,这是有道理的。在用户将窗口大小调整为任意大小的情况下,我们试图优雅而快速地处理它。