Files
better-genshin-impact/Fischless.GameCapture/Graphics/Helpers/Texture2DExtensions.cs
Shatyuka 0bea2d095a 截图优化 (#1480)
* BitBlt 优化

* BitBlt恢复Top-down

* 渲染时翻转图像

* CaptureSession引用计数

* 恢复成无拷贝Mat

* 合法性检查

* 优化截图预览窗口

* 保存截图文件必要时需要克隆一份Mat

* BitBlt内存池

* 返回拷贝就不用对Session做引用计数了

* 移除CaptureImageRes

* 优化DirectX

* 更好地处理padding

* BitBlt去掉padding

1920*1080的游戏窗口是4字节对齐的,因此不会有性能影响。这里主要用于测试。

* 修复修改窗口大小

* 合并CreateStagingTexture

* 修复设备丢失崩溃

* WGC截图支持HDR

* fix typo

* CodeQA

* 去掉1px窗口边框

* DirectX截图去掉A通道

* HDR转换使用GPU加速

---------

Co-authored-by: 辉鸭蛋 <huiyadanli@gmail.com>
2025-05-11 01:17:18 +08:00

49 lines
1.4 KiB
C#

using SharpDX.Direct3D11;
using System.Diagnostics;
using OpenCvSharp;
namespace Fischless.GameCapture.Graphics.Helpers;
public static class Texture2DExtensions
{
public static Mat? CreateMat(this Texture2D staging, Device d3dDevice, Texture2D surfaceTexture, ResourceRegion? region = null)
{
try
{
// Copy data
if (region != null)
{
d3dDevice.ImmediateContext.CopySubresourceRegion(surfaceTexture, 0, region, staging, 0);
}
else
{
d3dDevice.ImmediateContext.CopyResource(surfaceTexture, staging);
}
// 映射纹理以便CPU读取
var dataBox = d3dDevice.ImmediateContext.MapSubresource(
staging,
0,
MapMode.Read,
MapFlags.None);
try
{
using var mat = Mat.FromPixelData(staging.Description.Height, staging.Description.Width,
MatType.CV_8UC4, dataBox.DataPointer, dataBox.RowPitch);
return mat.CvtColor(ColorConversionCodes.BGRA2BGR);
}
finally
{
d3dDevice.ImmediateContext.UnmapSubresource(staging, 0);
}
}
catch (Exception e)
{
Debug.WriteLine("Failed to copy texture to mat.");
Debug.WriteLine(e.StackTrace);
return null;
}
}
}