0

マネージ DirectX アプリケーションからレンダリングされた画面をキャプチャしようとしています。通常、これを行う方法は次のとおりです。

Surface renderTarget = device.GetRenderTarget(0);
SurfaceLoader.Save(snapshotName, ImageFileFormat.Bmp, renderTarget);

これは(私の理解では)次のようなものの省略形です:

Surface renderTarget = device.GetRenderTarget(0);
Surface destTarget = device.CreateOffscreenPlainSurface(ClientRectangle.Width, ClientRectangle.Height, graphicsSettings.WindowedDisplayMode.Format, Pool.SystemMemory);
device.GetRenderTargetData(renderTarget,destTarget);
SurfaceLoader.Save(snapshotName,ImageFileFormat.Bmp, destTarget);

問題は、2 のべき乗でない次元のテクスチャをサポートしていない古いビデオ カードでは、上記の方法が失敗することです。いくつかの回避策を試しましたが、任意のサイズのスクリーン キャプチャを保存するというこの一見単純なタスクを達成できるものは何もないようです。たとえば、次の例は new Bitmap() で無効なパラメーターの例外により失敗します (これには、PresentFlag.LockableBackBuffer を使用してデバイスを作成する必要があることに注意してください)。

Surface surf = m_device.GetRenderTarget(0);
GraphicsStream gs = surf.LockRectangle(LockFlags.ReadOnly);
Bitmap bmp = new Bitmap(gs);
bmp.Save(snapshotName, ImageFormat.Png);
surf.UnlockRectangle();

どんなヒントでも大歓迎です...私は考えることができる(またはGoogleに出くわす)すべてを使い果たしました...

4

1 に答える 1

0

次に高い 2 のべき乗であるテクスチャを作成してから、サブ rect をコピーしてみませんか? 保存された画像に空白スペースがたくさんある場合でも、問題を回避できます。

Bitmap に問題があることに驚いています。ただし、その場合は、理想的でなくても上記が機能します。

于 2010-11-07T21:07:16.163 に答える