DirectX11 Present Hook 获取当前渲染的帧

DirectX11 Present Hook get currently rendered frame

提问人:Delta 提问时间:11/10/2023 最后编辑:Delta 更新时间:11/10/2023 访问量:40

问:

我正在游戏中挂钩 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);
}
C++ 渲染 挂钩 DirectX-11

评论

0赞 Tom Huntington 11/10/2023
您需要打开调试层,然后将错误发布 learn.microsoft.com/en-us/windows/win32/direct3d11/...
1赞 Delta 11/10/2023
谢谢,我是DirectX的初学者,这是引导我找到正确解决方案的评论。我所要做的就是在复制之前为描述设置正确的标志。它们是 CPUFlags = 0、BindFlags = D3D11_BIND_SHADER_RESOURCE 和 Usage = D3D11_USAGE_DEFAULT。

答: 暂无答案