[{"data":1,"prerenderedAt":112},["ShallowReactive",2],{"\u002F2020-06-13-ue4-crash-log-on-direct12-rhi":3},{"id":4,"title":5,"body":6,"date":88,"description":12,"extension":89,"meta":90,"navigation":93,"path":105,"seo":106,"stem":107,"tags":108,"__hash__":111},"blogs\u002F_legacy\u002F2020\u002F2020-06-13-ue4-crash-log-on-direct12-rhi.md","UE4在DX12 RHI上崩溃两例记录",{"type":7,"value":8,"toc":82},"minimark",[9,13,16,19,22,26,29,40,43,49,53,56,62,73,79],[10,11,12],"p",{},"主要是发生在global shader的自定义上，如果你没有使用的话估计原因不太一样~",[10,14,15],{},"当前使用UE版本为UE4.25.1。",[10,17,18],{},"原本在理解上感觉UE4的RHI封装应当是一致的，但实际情况还是会有些不同。",[10,20,21],{},"结论上看，在Direct12的RHI上有一些更加严格的限制，如果不注意的话就会出现问题。",[23,24,25],"h2",{"id":25},"参数顺序",[10,27,28],{},"Dx12的RHI要求Vertex Shader和Pixel Shader的参数顺序是一致的，也就是说OutPut的次序就是Input的次序，否则就会出现以下错误",[30,31,36],"pre",{"className":32,"code":34,"language":35},[33],"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",[37,38,34],"code",{"__ignoreMap":39},"",[10,41,42],{},"调整参数次序后不再出现。",[30,44,47],{"className":45,"code":46,"language":35},[33],"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",[37,48,46],{"__ignoreMap":39},[23,50,52],{"id":51},"setgraphicspipelinestate","SetGraphicsPipelineState",[10,54,55],{},"这个错误应当与初始化次序有关，主要是Vertex Shader等的参数必须在SetGraphicsPipelineState之后调用，否则就会出现一下错误",[30,57,60],{"className":58,"code":59,"language":35},[33],"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",[37,61,59],{"__ignoreMap":39},[10,63,64,65,72],{},"注意调整下次序就可以了，类似这样的[",[66,67,71],"a",{"href":68,"rel":69},"https:\u002F\u002Fgithub.com\u002FArisego\u002FUnrealLive2D\u002Fcommit\u002Fab8f25a34a2f9c491014ba33474eadd06c9a288a",[70],"nofollow","改动","]就可以了。",[30,74,77],{"className":75,"code":76,"language":35},[33],"        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",[37,78,76],{"__ignoreMap":39},[10,80,81],{},"大的逻辑上并没有什么问题，应该也不会出现RHI封装语义不一致的问题。都是一些细节上的约定没搞明白造成的。",{"title":39,"searchDepth":83,"depth":84,"links":85},2,3,[86,87],{"id":25,"depth":83,"text":25},{"id":51,"depth":83,"text":52},"2020-06-13","md",{"layout":91,"status":92,"published":93,"author":94,"author_login":96,"author_email":97,"wordpress_id":98,"wordpress_url":99,"date_gmt":100,"excerpt":101},"post","publish",true,{"display_name":95,"login":96,"email":97,"url":39},"风铃","flinkor","flinkor@foxmail.com",2917,"\u002F?p=2917","2020-06-13 03:22:38 +0000",{"type":7,"value":102},[103],[10,104,12],{},"\u002F2020-06-13-ue4-crash-log-on-direct12-rhi",{"title":5,"description":12},"_legacy\u002F2020\u002F2020-06-13-ue4-crash-log-on-direct12-rhi",[109,110],"UE4","Direct12","3fhLcl2u7jyfS6j562ueYgKWvVKuAmOkN-Ws-IHxJxY",1788763178507]