0
我試圖從託管DirectX應用程序中捕獲渲染屏幕。通常情況下,要做到這一點的方法如下:在託管DirectX中保存非功率2維屏幕截圖
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);
的問題是,在舊的顯卡不支持非二維度量紋理,上述失敗。我已經嘗試了一些解決方法,但似乎沒有任何東西能夠完成保存任意尺寸屏幕截圖的這個看似簡單的任務。例如,下面的新位圖()使用無效的參數異常失敗(請注意,這需要建立與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上開啓)...
那麼......這就是我最後一次嘗試(鎖定渲染目標位並從它們創建位圖)時得到的結果。我想我應該已經更清楚了,並說在這種情況下,問題不是紋理尺寸 - 這是事實上,「新位圖(gs)」生成一個無效的參數異常與gs不包含的消息任何圖像數據... – Metal450 2010-11-07 23:52:44