我们升级到UE5后,在编辑器下使用"Generic Android OpenGL"预览,有个材质编译出的shader,会在创建PSO的时候Crash:
D3D12 ERROR: ID3D12Device::CreateGraphicsPipelineState: Vertex Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic ‘COLOR’ is defined for mismatched hardware registers between the output stage and input stage. [ STATE_CREATION ERROR #660: CREATEGRAPHICSPIPELINESTATE_SHADER_LINKAGE_REGISTERINDEX]
查看编译后输出的d3dasm文件,发现PS的input少了个SV_POSITION,但原来的HLSL代码中(SlateElementPixelShader.usf,SlateVertexShader.usf),VS output, PS Input都是用的同一个结构体:
[Image Removed]
调试编译过程(CompileAndProcessD3DShaderFXCExt),发现PS在初次用fxc编译时是直接失败了的,报错内容:
error X8000: D3D11 Internal Compiler Error: Invalid Bytecode: Incompatible min precision type for operand #1 of opcode #22 (counts are 1-based). Expected int or uint.
然后会尝试用Spirv交叉编译:usf -> spriv -> hlsl, 最后的hlsl就可以用fxc编译通过,但是少了SV_POSITION,导致了最初的shader link报错。
我们尝试排查fxc直接编译SlateElementPixelShader.usf为啥会报错:
* 注释掉材质节点生成的代码能编译通过,但看不出看具体出了什么问题。
* 用/Od关闭优化后可以编译通过。
目前我们可能将这个材质的"Float Precision Mode"设为"Use Full-precision for every float"暂时避免这一问题。
请问官方大佬,解决这一类问题的最佳实践是什么? 或者说有没有别的更优雅的办法?
附件中的内容:
M_RingProgress.uasset:出问题的材质,公版5.5 Engine 可复现,直接放Content下。
M_RingProgress_bedb88d5fd5c9518: 出问题shader的各种中间debug输出文件。