【问题标题】:Get byte array from texture从纹理中获取字节数组
【发布时间】:2013-04-05 11:29:35
【问题描述】:

我可以从D3D11Texture2D 获取字节数组 (ARGB) 吗? DirectX 11 没有GetSurfaceLevelLockRect 的功能。

【问题讨论】:

    标签: c++ directx-11


    【解决方案1】:

    在您的 DeviceContext 上使用 Map/Unmap 函数。这仅适用于支持读取的纹理类型。

    例如

    D3D11_MAP eMapType = D3D11_MAP_READ;
    D3D11_MAPPED_SUBRESOURCE mappedResource;
    
    pDeviceContext->Map(m_pTexture, 0, eMapType, NULL, &mappedResource);
    
    BYTE* pYourBytes = (BYTE*)mappedResource.pData;
    unsigned int uiPitch = mappedResource.RowPitch;
    
    // Do stuff here
    
    pDevice->GetDeviceContext()->Unmap(m_pTexture, 0);
    

    如果要读取渲染纹理的内容,则需要先创建与渲染纹理格式相同的暂存纹理,然后使用 DeviceContext->CopyResource() 将渲染纹理复制到暂存纹理。

    【讨论】:

      【解决方案2】:

      为什么要读回纹理的数据?您将数据保存在 RAM 中,然后将其上传到 VRAM。您仍应将其保存在 RAM 或磁盘中。我错过了什么吗?

      您可能想看看它是如何在DirectX 11 framebuffer capture (C++, no Win32 or D3DX) 中解决的

      【讨论】:

      • 也许纹理是由着色器创建的
      • 我必须有RAM中现有纹理的ARGB格式数据。谢谢,我会看看你的例子。
      • 对,因为使用着色器创建纹理并将其读回是一种非常有效的方法。如果您会说,它是通过帧缓冲区创建的,那么...好吧,但在这种情况下,您可以通过帧缓冲区 API 访问它。
      • 如果我使用着色器它不起作用。我可以解决这个问题吗?我在哪里可以找到帧缓冲区 API 的示例?
      • 此问答可能会有所帮助:stackoverflow.com/questions/120066/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      相关资源
      最近更新 更多