私はD3D9で3Dモデリングアプリケーションを作成しており、可能な限り広く互換性を持たせたいと考えています。これは、ハードウェアに依存する機能、つまりマルチサンプリングをほとんど使用しないことを意味します。ただし、リアルタイムレンダリングは完璧である必要はありませんが、見栄えの良い画面キャプチャを提供する必要があります。マルチサンプリングを行わないと、エイリアシングが発生し、見栄えが悪くなります。
画面キャプチャを作成するには、メモリ内に一時的なサーフェスを作成し、シーンを1回レンダリングしてから、ファイルに保存します。アンチエイリアスキャプチャを実現する方法について最初に考えたのは、オフスクリーンのステンシルサーフェスをマルチサンプルとして作成することでしたが、デバイス自体が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);
CreateDepthStencilSurface()の呼び出しを見ることができます。これは、pp.MultiSampleTypeをieD3DMULTISAMPLE_4_SAMPLES
に置き換えることができると期待していた場所ですが、機能しませんでした。
私の次の考えは、(ビデオカードに関係なく)D3DDEVTYPE_REF
常にサポートする、まったく異なるLPDIRECT3DDEVICE9を作成することでした。D3DMULTISAMPLE_4_SAMPLES
ただし、すべてのリソース(メッシュ、テクスチャ)がHALデバイスであるm_d3ddevにロードされているため、REFデバイスでシーンをレンダリングするためにそれらを使用することはできませんでした。Direct3d9ex(Vista)ではデバイス間でリソースを共有できますが、私はXPで作業していることに注意してください。非常に多くのリソースがあるため、この1つのフレームをレンダリングするためにすべてをリロードしてからアンロードすることは、私のアプリケーションにとって時間効率が悪すぎます。
キャプチャ後に画像をアンチエイリアスするための他のオプション(つまり、3x3ブラーフィルター)を調べましたが、それらはすべてかなりひどい結果を生成したので、可能であれば、D3Dからアンチエイリアスされたシーンを取得してみてください。
どんな知恵や指針も大歓迎です...
ありがとう!