3

Windows7は、ポイントフィルタリングを使用して、DirectX9バックバッファーからウィンドウクライアント領域に拡張しています。ウィンドウのサイズを変更すると、ストレッチによるアーティファクトは非常に見栄えが悪くなります。バックバッファサイズを変更することでこれを回避できますが、IDirect3DDevice9 :: Reset()を呼び出す必要があります。これにより、画面が真っ暗になり、サイズ変更が行われている間、わずかな遅延が発生します。

Windowsが使用するフィルタリング方法を改善する方法はありますか?または、レンダーターゲットなどの別のDirectXサーフェスからウィンドウを更新する方法はありますか?


管理されていないC++DirectXコードを使用しています。1280x720のバックバッファサーフェスがあるとします。

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

それでも私は1920x1080のウィンドウを持っています:

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

Present()ウィンドウを呼び出すと、DirectXバックバッファーがウィンドウに拡張されます。ただし、それらのストレッチはフィルタリングを実行していないようです。

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

バックバッファのサイズを変更できますが、Reset()とReset( )を呼び出す必要があるため、ビデオメモリサーフェスが失われます。

4

3 に答える 3

0

IDirect3DDevice9::SetSamplerState を試しましたか?

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

実際、私は自分が抱えていた同様の問題を探していました。D3D9 テクスチャを使用していくつかの画像をレンダリングしました。Vista では、SetSamplerState と Linear Texture Filtering を組み合わせることで、ウィンドウのサイズを大幅に変更することによって生じるアーティファクトを減らすことができます。しかし、これは Windows7 には当てはまりません。これが 2 つのプラットフォームでどのように異なる方法で処理されるかはわかりません。

于 2012-07-30T17:11:26.310 に答える
0

質問している特定の操作のコード フラグメントをいくつか投稿していただけると助かりますが、GDI (Unmanaged Win32) StretchBlt 関数を使用している場合は、この投稿のように、HALFTONE を使用してサイズ変更動作を改善できます: Is StretchBltすべてのスケーリングで HALFTONE == BILINEAR?

GDI+ (WinForms/C#) を使用している場合は、g.InterpolationMode = InterpolationMode.Bilinear を使用してバイリニア (またはそれ以上) の補間を取得できます (すべてのオプションについては MSDN を参照してください)。通常、GDI+ は GDI (または DX) よりも遅いことに注意してください。

(この投稿の関連情報:バイリニア補間 - DirectX vs. GDI+ )

于 2012-07-13T02:22:41.953 に答える