提问人:Delta 提问时间:11/10/2023 最后编辑:Delta 更新时间:11/10/2023 访问量:40
DirectX11 Present Hook 获取当前渲染的帧
DirectX11 Present Hook get currently rendered frame
问:
我正在游戏中挂钩 DX Present 函数,我想在将当前渲染的帧传递给真正的 DXGI Present 函数之前获取/捕获该帧。
我应该补充一点,下面的代码仅在我按下 M(任意选择的键)时运行一次,而不是每一帧。我忘了提那个。我现在只想得到一个框架。
顶级域名; 我得到缓冲区,从中创建一个纹理,然后尝试从中创建一个 ShaderResourceView,这样我就可以使用 ImGui 显示它以进行调试,但是最后一步总是失败并E_INVALIDARGS。我已经验证了所有指针都是正确的(例如交换链、设备、设备上下文等)。
法典:
HRESULT hkDXGIPresent(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags)
{
// ...
ID3D11Texture2D* pBackBuffer = nullptr;
if (SUCCEEDED(pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer))))
{
D3D11_TEXTURE2D_DESC desc;
pBackBuffer->GetDesc(&desc);
desc.Usage = D3D11_USAGE_STAGING;
desc.BindFlags = 0;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
ID3D11Texture2D* pStagingTexture;
if (SUCCEEDED(pDevice->CreateTexture2D(&desc, nullptr, &pStagingTexture)))
{
pDeviceContext->CopyResource(pStagingTexture, pBackBuffer);
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.Format = desc.Format;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = desc.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
if (SUCCEEDED(pDevice->CreateShaderResourceView(pStagingTexture, &srvDesc, &pCapturedSRV)))
{
// This is never reached, CreateShaderResourceView always returns HRESULT -> E_INVALIDARGS
}
pStagingTexture->Release();
}
pBackBuffer->Release();
}
return Hooks::DXGIPresent(pSwapChain, SyncInterval, Flags);
}
答: 暂无答案
评论