在Managed DirectX中保存非pow-2维屏幕截图

时间:2010-11-07 19:24:44

标签: c# directx screenshot managed-directx

我正在尝试从Managed 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);

问题在于,在不支持非二维功率纹理的旧显卡上,上述操作失败。我已经尝试了许多变通方法,但似乎没有什么能够完成保存任意尺寸的屏幕截图这个看似简单的任务。例如,以下新的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上)......

1 个答案:

答案 0 :(得分:0)

为什么不创建一个纹理,它是2的最高幂,然后复制一个子矩形?即使保存的图像有足够的空白空间,它也会解决您的问题。

我很惊讶Bitmap有问题,tbh。但是..如果是这样的情况,那么即使它不理想,上述工作也会起作用。