[{"data":1,"prerenderedAt":114},["ShallowReactive",2],{"page-Direct12-1":3,"page-count-Direct12":113},[4],{"id":5,"title":6,"body":7,"date":89,"description":13,"extension":90,"meta":91,"navigation":94,"path":106,"seo":107,"stem":108,"tags":109,"__hash__":112},"blogs\u002F_legacy\u002F2020\u002F2020-06-13-ue4-crash-log-on-direct12-rhi.md","UE4在DX12 RHI上崩溃两例记录",{"type":8,"value":9,"toc":83},"minimark",[10,14,17,20,23,27,30,41,44,50,54,57,63,74,80],[11,12,13],"p",{},"主要是发生在global shader的自定义上，如果你没有使用的话估计原因不太一样~",[11,15,16],{},"当前使用UE版本为UE4.25.1。",[11,18,19],{},"原本在理解上感觉UE4的RHI封装应当是一致的，但实际情况还是会有些不同。",[11,21,22],{},"结论上看，在Direct12的RHI上有一些更加严格的限制，如果不注意的话就会出现问题。",[24,25,26],"h2",{"id":26},"参数顺序",[11,28,29],{},"Dx12的RHI要求Vertex Shader和Pixel Shader的参数顺序是一致的，也就是说OutPut的次序就是Input的次序，否则就会出现以下错误",[31,32,37],"pre",{"className":33,"code":35,"language":36},[34],"language-text","Fatal error: [File:D:\u002FBuild\u002F++UE4+Licensee\u002FSync\u002FEngine\u002FSource\u002FRuntime\u002FD3D12RHI\u002FPrivate\u002FD3D12Util.cpp] [Line: 581] hr failed at D:\u002FBuild\u002F++UE4+Licensee\u002FSync\u002FEngine\u002FSource\u002FRuntime\u002FD3D12RHI\u002FPrivate\u002FWindows\u002FWindowsD3D12PipelineState.cpp:697 with error E_INVALIDARG\nUE4Editor.exe has triggered a breakpoint.\n","text",[38,39,35],"code",{"__ignoreMap":40},"",[11,42,43],{},"调整参数次序后不再出现。",[31,45,48],{"className":46,"code":47,"language":36},[34],"void MainVS(\n    in uint GlobalVertexId : SV_VertexID,\n-    out float4 OutPosition : SV_POSITION,\n-    out float2 OutUV : TEXCOORD0   \n+    out float2 OutUV : TEXCOORD0,\n+    out float4 OutPosition : SV_POSITION\n    )\n{\n    OutPosition = float4(kSpriteVertices[GlobalVertexId], 0, 1);\n    OutUV = kQuadUVs[GlobalVertexId];\n}\n\n\n\nvoid MainPS(\n    in noperspective float2 IntUV : TEXCOORD0,\n    in float4 SvPosition : SV_POSITION,\n    out float4 OutColor : SV_Target0\n    )\n{\n    OutColor = float4(1,IntUV.r,0,1);\n}\n",[38,49,47],{"__ignoreMap":40},[24,51,53],{"id":52},"setgraphicspipelinestate","SetGraphicsPipelineState",[11,55,56],{},"这个错误应当与初始化次序有关，主要是Vertex Shader等的参数必须在SetGraphicsPipelineState之后调用，否则就会出现一下错误",[31,58,61],{"className":59,"code":60,"language":36},[34],"Ensure condition failed: CachedShader == VertexShader [File:D:\u002FBuild\u002F++UE4+Licensee\u002FSync\u002FEngine\u002FSource\u002FRuntime\u002FD3D12RHI\u002FPrivate\u002FD3D12Commands.cpp] [Line: 38] Parameters are being set for a VertexShader which is not currently bound\nUE4Editor.exe has triggered a breakpoint.\n",[38,62,60],{"__ignoreMap":40},[11,64,65,66,73],{},"注意调整下次序就可以了，类似这样的[",[67,68,72],"a",{"href":69,"rel":70},"https:\u002F\u002Fgithub.com\u002FArisego\u002FUnrealLive2D\u002Fcommit\u002Fab8f25a34a2f9c491014ba33474eadd06c9a288a",[71],"nofollow","改动","]就可以了。",[31,75,78],{"className":76,"code":77,"language":36},[34],"        GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader();\n        GraphicsPSOInit.BoundShaderState.PixelShaderRHI = PixelShader.GetPixelShader();\n\n+       SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);\n\n\n        VertexShader->SetParameters(RHICmdList, VertexShader.GetVertexShader(), ts_BaseColor, tsr_TextureRHI);\n        PixelShader->SetParameters(RHICmdList, PixelShader.GetPixelShader(), ts_BaseColor, tsr_TextureRHI);\n\n\n        \u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\n        \u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\n-       SetGraphicsPipelineState(RHICmdList, GraphicsPSOInit);\n\n\n\n        RHICmdList.SetStreamSource(0, ScratchVertexBufferRHI, 0);\n",[38,79,77],{"__ignoreMap":40},[11,81,82],{},"大的逻辑上并没有什么问题，应该也不会出现RHI封装语义不一致的问题。都是一些细节上的约定没搞明白造成的。",{"title":40,"searchDepth":84,"depth":85,"links":86},2,3,[87,88],{"id":26,"depth":84,"text":26},{"id":52,"depth":84,"text":53},"2020-06-13","md",{"layout":92,"status":93,"published":94,"author":95,"author_login":97,"author_email":98,"wordpress_id":99,"wordpress_url":100,"date_gmt":101,"excerpt":102},"post","publish",true,{"display_name":96,"login":97,"email":98,"url":40},"风铃","flinkor","flinkor@foxmail.com",2917,"\u002F?p=2917","2020-06-13 03:22:38 +0000",{"type":8,"value":103},[104],[11,105,13],{},"\u002F2020-06-13-ue4-crash-log-on-direct12-rhi",{"title":6,"description":13},"_legacy\u002F2020\u002F2020-06-13-ue4-crash-log-on-direct12-rhi",[110,111],"UE4","Direct12","3fhLcl2u7jyfS6j562ueYgKWvVKuAmOkN-Ws-IHxJxY",1,1788763178523]