2010-11-07 78 views
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上開啓)...

回答

0

爲什麼不創建一個紋理,這是2的下一個最高次冪,然後複製一個子矩形?即使保存的圖像具有整個空白區域,它也能解決您的問題。

我很驚訝位圖有問題,tbh。但是,如果是這種情況,那麼上述將工作,即使它不理想。

+0

那麼......這就是我最後一次嘗試(鎖定渲染目標位並從它們創建位圖)時得到的結果。我想我應該已經更清楚了,並說在這種情況下,問題不是紋理尺寸 - 這是事實上,「新位圖(gs)」生成一個無效的參數異常與gs不包含的消息任何圖像數據... – Metal450 2010-11-07 23:52:44