设置 r.EarlyZPassOnlyMaterialMasking 1 后,设置 bCastDynamicShadowAsMasked 的半透明会消失

设置 r.EarlyZPassOnlyMaterialMasking 1 后,设置 bCastDynamicShadowAsMasked 的半透明会消失

[Attachment Removed]

Steps to Reproduce
如果设置了r.EarlyZPassOnlyMaterialMasking 1。那么之后,任何在材质中,启用 bCastDynamicShadowAsMasked ,都会消失。原因是设置了这个Flag的半透明材质,IsMasked会返回true,在 SetDepthStencilStateForBasePass 函数中,bMaskedInEarlyPass会变成true,深度测试func变为Equal,从而导致深度测试失败,整个半透明无法显示

[Attachment Removed]

Hi,

请问你用5.7或者5.8的版本可以复现吗,从代码上看,应该是判断IsMaskedBlendMode,这个函数应该不会因为bCastDynamicShadowAsMasked 的值返回true?

[Attachment Removed]

都可以复现。bCastDynamicShadowAsMasked会使得 IsMasked 返回 true, IsMasked的函数语义上,现在会包含Translucent,我理解这是为了 Cast Shadow 而做的。你可以看一下UMaterial::IsMasked和UMaterialInstance::IsMasked

bool UMaterial::IsMasked() const

{

return GetBlendMode() == BLEND_Masked || (GetBlendMode() == BLEND_Translucent && GetCastDynamicShadowAsMasked());

}

[Attachment Removed]

嗯嗯,但是我看SetDepthStencilStateForBasePass是用的IsMaskedBlendMode,应该只是检查BlendMode吧?

[Attachment Removed]

抱歉,我本地是UE5.7的版本,我看到在5.8版本,已经提交了修复,改成 IsMaskedBlendMode了

https://github.com/EpicGames/UnrealEngine/commit/4abb337283b672557d7cb7605827a6c50ee051ec

[Attachment Removed]

好的,我以为你用的是Main的代码,所以没有对以前的代码。问题解决就好。

[Attachment Removed]