Ensure condition failed: DrawData.VisibleInstanceCount <= DrawData.TotalInstanceCount

Hi,

1、打开CVar:r.MeshDrawCommands.Stats 1

2、创建一个PointLight,并且CastShadow

3、创建两个一样的Cube

4、将PointLight,拖入到其中一个Cube内部,这时就会触发Ensure condition failed: DrawData.VisibleInstanceCount <= DrawData.TotalInstanceCount

<br/>

DrawData.VisibleInstanceCount是从GPU IndirectBuffer回读回来的数据,大于总InstanceCount。

<br/>

麻烦帮忙看看这个问题,谢谢

[Image Removed]

重现步骤
1、打开CVar:r.MeshDrawCommands.Stats 1

2、创建一个Point Light,并且CastShadow

3、创建两个一样的Cube

4、将PointLight,拖入到其中一个Cube内部,这时就会触发Ensure

Hi,

你好,我尝试复现,但是没有复现这个问题,请问方便提供一个简单的的蓝图复现工程​?

开启r.MeshDrawCommands.Stats的情况下,然后不断地将pointlight,从某一个cube里拖入拖出。

当pointlight进入/离开 cube时,就会触发。

Hi,

抱歉,我又试了几次,仍然没有复现,要不方便的话,你提供一个简单的蓝图复现工程?我上传了一个操作视频,可以看一下操作完后,log里没有红色区域提示出问题了。

Hi,我在5.5.4 launcher是可以稳定复现的。我本地未修改的5.6 source版也无法复现。[Image Removed]

Hi,

请问你有没有设置r.InstanceCulling.ForceInstanceCulling 1? 我看了一下代码,正常这里应该只有开了GPUScene,HISM或者ISM的Draw才会走到这里,但是不知道你是不是开启了强制InstanceCulling,所以走到了这段代码。5.6没有复现应该也是因为没有开强制InstanceCulling,开启了也有这个问题。

如果你们一定要开启,这里可以把这个ensure注掉,不影响实际运行。

Hi,

我刚才验证了一下,UE5.6只有Vulkan和DX11有问题,DX12没有问题。

麻烦您把RHI换一下试试,如果不行,我上传一下复现工程。

我的测试工程没有设置过gpu scene以及instance culling相关,r.InstanceCulling.ForceInstanceCulling是0

我们先把ensure注释掉吧。

Hi,

如果能走到报ensure错的地方,这个draw应该是一个indirect draw,我只是觉得复现的步骤应该走不到这里。当然如果因为某些原因走到了这里,需要引擎支持从gpu里回读indirect draw的count,这个目前其他RHI应该是不支持,所以vulkan和DX11有问题。

Hi,查了一下,是渲染PointLight的ShadowMap时,导致的问题。[Image Removed]会强制走indirect draw,当两个cube自动合批为一个draw后,因为是Indirect draw所以没有地方记录合批数量了,导致Instance数量没有累加,总Instance还是1*ViewNum=6,所以就报错了。

好的,感谢。