D3D9に3Dモデリングアプリケーションを作成していますが、これは可能な限り広く互換性を持たせたいと考えています。これは、ハードウェア依存の特徴、すなわちマルチサンプリングをほとんど使用しないことを意味する。しかし、リアルタイムレンダリングは完璧なものである必要はありませんが、マルチサンプリングを行わなくても、エイリアスや貧弱に見える素敵な画面キャプチャを提供する必要があります。D3D9でのアンチエイリアス/マルチサンプリング
スクリーンキャプチャを作成するには、一時的なサーフェスをメモリに作成し、そのシーンを一度レンダリングしてファイルに保存します。私がアンチエイリアス処理をどのように達成できるかについての最初の考えは、オフスクリーンのステンシル面をマルチサンプルとして作成することでしたが、DX自体はD3DMULTISAMPLE_NONEで初期化されていたため、DXでは許されません。
まず、スクリーンキャプチャの作成方法のサンプルを紹介します。既にレンダリングされたフレームのバックバッファを保存する方が簡単だとわかっていますが、実際のレンダリングウィンドウとは異なる次元のイメージを保存する必要があります。ここでは簡潔にするために、エラーチェック、状態復元コード、およびリソース解放を省略しています。 m_d3ddevは私のLPDIRECT3DDEVICE9です。
//Get the current pp
LPDIRECT3DSWAPCHAIN9 sc;
D3DPRESENT_PARAMETERS pp;
m_d3ddev->GetSwapChain(0, &sc);
sc->GetPresentParameters(&pp);
//Create a new surface to which we'll render
LPDIRECT3DSURFACE9 ScreenShotSurface= NULL;
LPDIRECT3DSURFACE9 newDepthStencil = NULL;
LPDIRECT3DTEXTURE9 pRenderTexture = NULL;
m_d3ddev->CreateDepthStencilSurface(_Width, _Height, pp.AutoDepthStencilFormat, pp.MultiSampleType, pp.MultiSampleQuality, FALSE, &newDepthStencil, NULL);
m_d3ddev->SetDepthStencilSurface(newDepthStencil);
m_d3ddev->CreateTexture(_Width, _Height, 1, D3DUSAGE_RENDERTARGET, pp.BackBufferFormat, D3DPOOL_DEFAULT, &pRenderTexture, NULL);
pRenderTexture->GetSurfaceLevel(0,&ScreenShotSurface);
//Render the scene to the new surface
m_d3ddev->SetRenderTarget(0, ScreenShotSurface);
RenderFrame();
//Save the surface to a file
D3DXSaveSurfaceToFile(_OutFile, D3DXIFF_JPG, ScreenShotSurface, NULL, NULL);
あなたは、私がすなわちD3DMULTISAMPLE_4_SAMPLES
でpp.MultiSampleTypeを置き換えることができますが、それはうまくいきませんでした期待していたところであるCreateDepthStencilSurface()への呼び出しを、見ることができます。
次に、D3DDEVTYPE_REF
という全く異なるLPDIRECT3DDEVICE9を作成しました。これは常にD3DMULTISAMPLE_4_SAMPLES
(ビデオカードに関係なく)をサポートしています。しかし、私のリソース(メッシュ、テクスチャ)はすべて私のHALデバイスのm_d3ddevにロードされています。したがって、REFデバイスの下でシーンをレンダリングするためには使用できませんでした。 Direct3d9ex(Vista)ではデバイス間でリソースを共有できますが、私はXPで作業しています。リソースが非常に多いので、この1つのフレームをレンダリングするためにすべてをリロードしてからアンロードすると、アプリケーションには時間がかかりません。
画像のキャプチャ後の画像(つまり3x3ぼかしフィルタ)をアンチエイリアスするための他のオプションを検討しましたが、それらはすべてかなり虚偽の結果を生成しましたので、可能であればD3Dから正しくアンチエイリアス処理されたシーンを取得してみたい....
任意の知恵やポインタをいただければ幸いです...
ありがとう!
マルチサンプル機能を検出し、使用可能な場所でのみ使用します(パフォーマンスを無効にするオプションを使用することもできます)。あなたがやろうとしていることをやって、互換性を改善しているようなものではないということです。 – U62
これは私の最後の手段ですが、本当にやりたいことは、ビデオカードの機能に関係なく、アンチエイリアス処理された画像を提供できることです。私はリアルタイムレンダリングの品質についてあまり気にしません (これは間違いなく互換性を向上させるでしょう - 参照デバイス_always_はマルチサンプリングをサポートするので、そのタイプのデバイスを使ってスクリーンショットをレンダリングすることができますしかし、まだ上記の問題があるので、私はいくつかの他の解決策を期待していた...) – Metal450