通过HOOK的方式从DirectX 11中截取纹理图(DDS资源)

已经HOOK了PSSetShaderResources函数,但是缺乏相关领域的知识,不知道该如何将纹理图从ID3D11ShaderResourceView中取出。
目前尚不明确纹理图具体格式,可能是BC7/BC5(DXT5)。

有偿求助,希望各位大神不吝赐教。

目前的代码:

HRESULT MyPSSetShaderResources(ID3D11DeviceContext* pContext, UINT StartSlot, UINT NumViews, ID3D11ShaderResourceView* const* ppShaderResourceViews)
{

    //ID3D11DeviceContext* pContext, UINT StartSlot, UINT NumViews, ID3D11ShaderResourceView* const* ppShaderResourceViews
    // 调用原始函数获取纹理图像
    static bool bIsEnter = false;

    // 获取纹理图像
    if (NumViews > 0 && ppShaderResourceViews != nullptr && ppShaderResourceViews[0] != nullptr)
    {
        for (int i = 1; i < NumViews; i++)
        {
            if (ppShaderResourceViews[i] == nullptr)
            {
                continue;
            }

            ID3D11Resource* pResource = nullptr;
            ppShaderResourceViews[i]->GetResource(&pResource);
            if (pResource == nullptr)
            {
                continue;
            }
                        
            ID3D11Texture2D* texture2D = nullptr;
            ID3D11Texture3D* texture3D = nullptr;

            pResource->QueryInterface(__uuidof(ID3D11Texture2D), (void**)&texture2D);
            pResource->QueryInterface(__uuidof(ID3D11Texture3D), (void**)&texture3D);

            ID3D11Texture2D* pTexture = nullptr;
            HRESULT hr = pResource->QueryInterface<ID3D11Texture2D>(&pTexture);
            if (SUCCEEDED(hr))
            {
                D3D11_TEXTURE2D_DESC desc = {};
                Microsoft::WRL::ComPtr<ID3D11Texture2D> pStaging;
                HRESULT hr = CaptureTexture2(pContext, pTexture, desc, pStaging);
                if (!SUCCEEDED(hr))
                {
                    SPDLOG_LOGGER_INFO(Logger::getLogger(), "CaptureTexture fail");
                    pTexture->Release();
                    pResource->Release();
                    goto END;
                }

                if (desc.Format == DXGI_FORMAT_BC7_TYPELESS)
                {
                    static DWORD dwDD = 0;
                    wchar_t szPath[MAX_PATH] = { 0x0 };
                    wsprintfW(szPath, L"D:\\123\\%d.png", dwDD);
                    dwDD++;

                    DirectX::SaveWICTextureToFile(pContext, pTexture, GUID_ContainerFormatPng, szPath);
                }

                pContext->Unmap(pStaging.Get(), 0);
                pTexture->Release();
            }

            pResource->Release();
        }

    }

END:
    HRESULT hr = oFunc_PSSetShaderResources(pContext, StartSlot, NumViews, ppShaderResourceViews);

    return hr;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值