我们升级到UE5后,在编辑器下使用"Generic Android OpenGL"预览,有个材质编译出的shader,会在创建PSO的时候Crash

我们升级到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输出文件。

Hi,

你好,附件里好像没有文件,麻烦再上传一下。

Hi,

你好,我可以复现这个问题,的确5.5有这个问题,我暂时不知道是哪里修复了这个问题,我怀疑是DXC相关的地方,我已经再问总部的同事是否有印象可能是哪里的改动,如果后续有消息,我再继续回复。

Hi,

找到对应的fix了,https://github.com/EpicGames/UnrealEngine/commit/c5fb42b25124228363e43bf248241eccb36a77ef,合入以后,对应的材质球需要随便修改一下,保存后再切换到opengl preview窗口。