You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unreal Engine中用C++从设备获取ID3D11DepthStencilView

解决Unreal Engine中OMGetRenderTargets返回空ID3D11DepthStencilView的问题

我来帮你排查这个问题——你已经成功拿到了Unreal的D3D11设备,但调用OMGetRenderTargets()总是拿不到深度模板视图,大概率是这几个环节出了问题:

1. 检查参数传递是否正确

ID3D11DeviceContext::OMGetRenderTargets()的深度模板视图参数要求是指针的指针(ID3D11DepthStencilView**)。如果你的代码里第三个参数传的是ID3D11DepthStencilView*而不是**,那肯定会返回空。你可以把代码补全修正成这样:

ENQUEUE_UNIQUE_RENDER_COMMAND_THREEPARAMETER(
    FGETDEVICE,
    void**, NATIVEDEVICE, &NativeDevice,
    ID3D11RenderTargetView**, ppRenderTargetViews, &m_ppRenderTargetViews,
    ID3D11DepthStencilView**, ppDepthStencilView, &m_ppDepthStencilView,
    {
        // 先获取D3D11即时上下文
        ID3D11DeviceContext* Context = nullptr;
        static_cast<ID3D11Device*>(*NATIVEDEVICE)->GetImmediateContext(&Context);
        
        if (Context)
        {
            // 调用OMGetRenderTargets,第一个参数是要获取的渲染目标数量(这里取1个主RT)
            Context->OMGetRenderTargets(1, *ppRenderTargetViews, *ppDepthStencilView);
            Context->Release();
        }
    }
);

2. 确保在正确的渲染阶段调用

Unreal的渲染线程有严格的阶段划分,如果你在没有绑定深度缓冲的渲染阶段调用(比如UI渲染pass、后期处理的无深度阶段),OMGetRenderTargets自然拿不到深度视图。

你应该在场景渲染的活跃阶段调用,比如挂载到BeginRendering或者PostRender的回调里,确保当前正在渲染带有深度缓冲的场景。

3. 优先用Unreal RHI接口获取(更可靠)

直接调用原生D3D11 API容易踩Unreal渲染流程的坑,推荐先通过Unreal的RHI接口拿到深度缓冲,再转成D3D11视图:

FRHICommandListImmediate& RHICmdList = FRHICommandListExecutor::GetImmediateCommandList();
FDepthStencilRHIRef DepthStencil = RHICmdList.GetDepthStencil();
if (DepthStencil.IsValid())
{
    // 转成原生D3D11深度模板视图
    ID3D11DepthStencilView* D3DSV = static_cast<ID3D11DepthStencilView*>(DepthStencil.GetNativeResource());
    // 这里的D3DSV就是你需要的对象
}

这种方式更贴合Unreal的渲染逻辑,能避免很多时机或绑定状态的问题。

4. 验证设备指针有效性

最后别忘了确认你拿到的NativeDevice是有效的D3D11设备:

ID3D11Device* D3DDevice = static_cast<ID3D11Device*>(*NATIVEDEVICE);
if (!D3DDevice)
{
    UE_LOG(LogTemp, Error, TEXT("Invalid D3D11 Device!"));
    return;
}

总结一下:优先用Unreal RHI接口获取深度缓冲再转原生视图;如果一定要用D3D11原生API,务必保证参数传递正确、调用时机在有深度缓冲绑定的渲染阶段。

内容的提问来源于stack exchange,提问作者Rohit Singh Bisht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:07