Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ D3D11 C+中的屏幕捕获+;_C++_Directx 11_D3dx - Fatal编程技术网

C++ D3D11 C+中的屏幕捕获+;

C++ D3D11 C+中的屏幕捕获+;,c++,directx-11,d3dx,C++,Directx 11,D3dx,是否可以在D3D11中制作DirectX应用程序(例如游戏)的屏幕截图 我可以在DirectX 9或API挂钩(IDXGISwapChain::Present)中轻松实现,但在DirectX 11中不可能实现 我初始化D3D11并使用游戏窗口(FindWindow())创建交换链, 然后我得到了一个后缓冲 然后 ID3D11Texture2D::GetDesc() 用在 ID3D11Device::CreateTexture2D(), 然后 ID3D11DeviceContext::CopyRe

是否可以在D3D11中制作DirectX应用程序(例如游戏)的屏幕截图

我可以在DirectX 9或API挂钩(IDXGISwapChain::Present)中轻松实现,但在DirectX 11中不可能实现

我初始化D3D11并使用游戏窗口(FindWindow())创建交换链, 然后我得到了一个后缓冲

然后 ID3D11Texture2D::GetDesc() 用在 ID3D11Device::CreateTexture2D(), 然后 ID3D11DeviceContext::CopyResource() 这给了我一个新的ID3D11Texture2D资源

当我用像D3DX11SaveTextureToFile()这样的常用方法保存它时,我总是得到一个黑色图像

我忘了什么


谢谢。

我想这里有两个步骤来检查您的代码:

  • ID3D11DeviceContext::CopyResource()是否按预期工作?正如我们所知,这个函数要求src和des的描述完全相同,src-tex与des-tex有一些不同的描述。您可以直接输出到窗口以在保存之前进行检查

  • D3DX11SaveTextureToFile已弃用,被SaveToxxFile取代(其中XXX是WIC、DDS或TGA;WIC不支持DDS和TGA;D3DX9支持TGA作为游戏的通用艺术源格式)。DirectXTex和DirectXTK库是新的。但如果配置适当,它现在仍然有效。检查此func返回值。确保你知道如何使用

    HRESULT D3DX11SaveTextureToFile(
           ID3D11DeviceContext      *pContext,
      _In_ ID3D11Resource           *pSrcTexture,
      _In_ D3DX11_IMAGE_FILE_FORMAT DestFormat,
      _In_ LPCTSTR                  pDestFile
    );
    

  • 我认为这里有两个步骤来检查您的代码:

  • ID3D11DeviceContext::CopyResource()是否按预期工作?正如我们所知,这个函数要求src和des的描述完全相同,src-tex与des-tex有一些不同的描述。您可以直接输出到窗口以在保存之前进行检查

  • D3DX11SaveTextureToFile已弃用,被SaveToxxFile取代(其中XXX是WIC、DDS或TGA;WIC不支持DDS和TGA;D3DX9支持TGA作为游戏的通用艺术源格式)。DirectXTex和DirectXTK库是新的。但如果配置适当,它现在仍然有效。检查此func返回值。确保你知道如何使用

    HRESULT D3DX11SaveTextureToFile(
           ID3D11DeviceContext      *pContext,
      _In_ ID3D11Resource           *pSrcTexture,
      _In_ D3DX11_IMAGE_FILE_FORMAT DestFormat,
      _In_ LPCTSTR                  pDestFile
    );
    

  • 这是可能的,但不是微不足道的,因为您必须执行您提到的API挂钩。OBS项目可能“在其代码中的某个地方”实现了这一点。另外,如果您的目标是Windows 8客户端,那么桌面复制API就是一种方法:OBS使用我引用的钩子(DXGICapture.cpp文件)。这很容易,就像使用DirectX9一样,但我不明白为什么使用DirectX11的类似方法会显示黑色图像它是黑色的可能是因为CopyResource失败,您可以尝试使用dx控制面板强制调试层,并获取更多有关其失败原因的信息。请查看的实现,因为您可能只是错过了一个解决步骤。也就是说,请记住,API挂钩在a/V软件中看起来很像恶意软件。还要注意的是,D3DX11是并且有许多永远不会被修复的错误。这是可能的,但不是微不足道的,因为您必须执行您提到的API挂钩。OBS项目可能“在其代码中的某个地方”实现了这一点。另外,如果您的目标是Windows 8客户端,那么桌面复制API就是一种方法:OBS使用我引用的钩子(DXGICapture.cpp文件)。这很容易,就像使用DirectX9一样,但我不明白为什么使用DirectX11的类似方法会显示黑色图像它是黑色的可能是因为CopyResource失败,您可以尝试使用dx控制面板强制调试层,并获取更多有关其失败原因的信息。请查看的实现,因为您可能只是错过了一个解决步骤。也就是说,请记住,API挂钩在a/V软件中看起来很像恶意软件。还要注意的是,D3DX11是,并且有一些永远不会被修复的bug。