设置 r.EarlyZPassOnlyMaterialMasking 1 后,设置 bCastDynamicShadowAsMasked 的半透明会消失
[Attachment Removed]
设置 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]