已经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;
}