Culling doesnt work properly in Oculus Quest

Hi there,

We are trying to optimize our project for Oculus Quest but we are running into issues with both hadrware and software occlusion culling in our project. In theory, engine culls an object if its behind another object. Hardware Occlusion Culling is on by default and done automatically. This is working perfectly fine in editor. But its not working on runtime on Oculus Quest.

We use RenderDoc to see which meshes are rendered. Walls of the house are renderd almost at the end of the frame. So everthing behind the wall, that are not actually seen by the camera are rendered too. At first, we thougt that objects rendered first if they are closer to the camera and last if they are furthest. So we adjusted the pivot of the wall to be closer to camera than object behind it. But still the wall was rendered almost at the end of the frame.

We use Precomputed Visibility too. But that one is not working great either.

Then we turned on Software Occlusion Culling too (We set it up properly too. Selected which meshes to be used and which LOD to be used for SOC). This didnt work either. This actually worked. Saved 5-10 fps on average. But it didnt cull everything properly.

Then we thought maybe bp actors (almost everthing you see in the frame are bp actor. Bc they are all interactable. Walls included) are rendered after static mesh actors etc. This was a success to some degree. So we put the same static mesh just in front of the walls. This culled the objects behind it in some cases but not all.

So what do you think is the problem here? What is the priority for rendering an object first?

Some project settings that might be related:
Support Software Occlusion Culling - True
Occlusion Culling - True - Other settings for culling at default
Early Z-pass - Decide auto
Clear scene - hardware clear
Instanced stereo - false
Mobile HDR - false
Mobile Multi view - true
Round Robin Occlusion Quesries - true

Wanted to add to this and say I ran into the exact same problem when testing projects on the Quest and could not figure it out.

The only ‘solution’ I had was to manually show / hide objects in the scene based on what the user could see from their location. For example, we had pre-defined teleport spots and I would have a list of ‘viewable’ assets associated with each spot. When the user teleported to that spot we would show everything in that list, but hide everything else from being rendered. However, for ‘free roam’ teleportation this most likely would not work.

I have a feeling there is some actual setting to fix this but I went through all the same project settings you listed and tried different combinations but no matter what object culling would not happen properly on the Quest.

If you ever find a solution to this problem I would love to know it as well!

We didnt find a solution but its it a acceptable stage with SOC. It still happens but much less. We found that setting Precomputed Visibility to Aggressive helps too.

Our project is free roam too. But its a very nice idea for fixed teleport spots.

Setting LOD for Occluder to 0 seemed to fix the problem for me.

I applied this setting on the wall meshes in my scene and the draw calls were reduced when objects were blocked by the wall.

Occluder mesh.PNG