UE4在DX12 RHI上崩溃两例记录

主要是发生在global shader的自定义上,如果你没有使用的话估计原因不太一样~

当前使用UE版本为UE4.25.1。

原本在理解上感觉UE4的RHI封装应当是一致的,但实际情况还是会有些不同。

结论上看,在Direct12的RHI上有一些更加严格的限制,如果不注意的话就会出现问题。

参数顺序

Dx12的RHI要求Vertex Shader和Pixel Shader的参数顺序是一致的,也就是说OutPut的次序就是Input的次序,否则就会出现以下错误

Fatal error: [File:D:/Build/++UE4+Licensee/Sync/Engine/Source/Runtime/D3D12RHI/Private/D3D12Util.cpp] [Line: 581] hr failed at D:/Build/++UE4+Licensee/Sync/Engine/Source/Runtime/D3D12RHI/Private/Windows/WindowsD3D12PipelineState.cpp:697 with error E_INVALIDARG
UE4Editor.exe has triggered a breakpoint.

调整参数次序后不再出现。

void MainVS(
    in uint GlobalVertexId : SV_VertexID,
-    out float4 OutPosition : SV_POSITION,
-    out float2 OutUV : TEXCOORD0	
+    out float2 OutUV : TEXCOORD0,
+    out float4 OutPosition : SV_POSITION
    )
{
	OutPosition = float4(kSpriteVertices[GlobalVertexId], 0, 1);
	OutUV = kQuadUVs[GlobalVertexId];
}



void MainPS(
    in noperspective float2 IntUV : TEXCOORD0,
    in float4 SvPosition : SV_POSITION,
    out float4 OutColor : SV_Target0
    )
{
    OutColor = float4(1,IntUV.r,0,1);
}

SetGraphicsPipelineState

这个错误应当与初始化次序有关,主要是Vertex Shader等的参数必须在SetGraphicsPipelineState之后调用,否则就会出现一下错误

Ensure condition failed: CachedShader == VertexShader [File:D:/Build/++UE4+Licensee/Sync/Engine/Source/Runtime/D3D12RHI/Private/D3D12Commands.cpp] [Line: 38] Parameters are being set for a VertexShader which is not currently bound
UE4Editor.exe has triggered a breakpoint.

注意调整下次序就可以了,类似这样的[改动]就可以了。

        GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();
        GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();

+       SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);


        VertexShader->SetParameters(RHICmdList, VertexShader.GetVertexShader(), ts_BaseColor, tsr_TextureRHI);
        PixelShader->SetParameters(RHICmdList, PixelShader.GetPixelShader(), ts_BaseColor, tsr_TextureRHI);


        //////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////
-       SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);



        RHICmdList.SetStreamSource(0, ScratchVertexBufferRHI, 0);

大的逻辑上并没有什么问题,应该也不会出现RHI封装语义不一致的问题。都是一些细节上的约定没搞明白造成的。

本博客所有内容遵循CC BY-NC-SA 3.0协议, 如有转载,请注明出处。
9 条评论

    你好!很幸运看到您的这个贴,我们在项目美术收尾阶段遇到了类似问题,确实是Direct12引起的,但您的解决方案对我们来说太高深了,(我们主要是一群美工,没有任何程序经验)。希望能得到您的帮助


    你好,这边记录的问题是自己定义shader来执行一些额外渲染时遇到的,极有可能和一些通用的问题的原因不一样。
    如果贵项目没有自定义引擎的话,或许将错误发到官方论坛去交流比较好一些~


    我也出现类似问题,很顺畅的解决了。

    下载“DirectX修复工具”最新版本是4.0,然后点击检查修复,确保按钮旁边有一个下拉箭头是选中了“同步更新C++”的。

    先试一遍如果都OK那就好,如果还是不行,那么重启一下电脑,然后再次打开软件,在软件“工具”菜单,“选项”里面的“高级”选项卡,找到“C++强力修复”前面打钩。

    再执行一遍检测修复,软件会自动联网更新组建,等待一会儿修复完成,就能正常打开UE4了。


    你好,我在4.26.2 Android Vulkan上遇到了相似的问题,报错Assertion failed: BoundShaderInput.PixelShaderRHI == ShaderRHI,同样方式解决,感谢博主!!!


    老哥…纯美工看不懂咋修复啊…我这是ue4正常,打开ue5那个演示demo就报错,之前成功打开过…非配置问题。
    Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0xffffffffffffffff

    UnrealEditor_D3D12RHI
    UnrealEditor_D3D12RHI
    UnrealEditor_D3D12RHI
    UnrealEditor_D3D12RHI
    UnrealEditor_D3D12RHI
    UnrealEditor_D3D12RHI
    UnrealEditor_RHI
    UnrealEditor_RHI
    UnrealEditor_RHI
    UnrealEditor_RHI
    UnrealEditor_Core
    UnrealEditor_Core
    UnrealEditor_Core
    UnrealEditor_RenderCore
    UnrealEditor_Core
    UnrealEditor_Core
    kernel32
    ntdll


    而且楼上说的c++修复我是全绿,dx12也没修复出什么问题。。


    UE5还没有研究过呢,不过大概率应该是别的问题,文中记录的是自定义了GlobalShader时在4.25版本升级中遇到的问题

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>