开启PreZ后Mask材质与Opaque材质渲染顺序问题

在Commit 28fa65a下,修改了开启preZ时Mask和Opacity材质的排序,使得先绘制Mask材质后绘制Opacity材质,想请问一下这样修改是为了解决什么潜在的渲染问题?

对应代码在Engine/Source/Runtime/Renderer/Private/MobileBasePass.cpp

680行

if (EarlyZPassMode != DDM_None)
	{
		SortKey.BasePass.Masked = bIsMasked ? 0 : 1;
	}
	else
	{
		SortKey.BasePass.Masked = bIsMasked ? 1 : 0;
	}

Hi,

你好,这是修复PC和Mobile OverlayMaterial渲染顺序不统一导致的画面问题。现在mobile的排序方式跟PC一致了。我的理解是PC上因为有prepass,base pass会先画mask,后画的opaque,因为他们的depth应该是相同的,所以后画的会覆盖先画的。

感谢解答,我还想请问一下

对于PC的顺序,我也有同样的问题,为什么开启PreZ时需要先画Mask,后画Opaque,而不是无论是否开启PreZ都保持先画Opaque后画Mask,或者都保持先画Mask后画Opaque

这个绘制顺序为什么要与PreZ是否开启相关联?

这个我没有确切答案(我感觉当时的作者可能也想不起来了),从性能上来看,我不知道有什么明显差异。改动的注释大概是这样的。这个改动的前后也没有做过任何的性能差一点对比。所以我觉得这种写法不是很刻意的。

CL#4527752
-Cleaning up mesh draw command sorting. Sorting keys are calculated inside mesh processors independent from view and are cached for cached mesh commands. View dependent parts are updated later inside VisibileMeshCommands just before sorting for a specific view.
-Base pass mesh command sorting by masked / nonmasked blend mode.
-Removed EMeshPassFlags::SortBySortKey for simplicity. Now we always sort by sort key and then state bucket id.

好的,明白了😀

谢谢解答​