Jump to content

Umbra Sucks. Check out our Easy No-Bake Occlusion Culling


With the help of @martyj I was able to test out occlusion culling in the new engine. This was a great chance to revisit an existing feature and see how it can be improved. The first thing I found is that determining visibility based on whether a single pixel is visible isn't necessarily a good idea. If small cracks are present in the scene one single pixel peeking through can cause a lot of unnecessary drawing without improving the visual quality. I changed the occlusion culling more to record the number of pixels drawn, instead just using a yes/no boolean value:

glBeginQuery(GL_SAMPLES_PASSED, glquery);

In OpenGL 4.3, a less accurate but faster GL_ANY_SAMPLES_PASSED_CONSERVATIVE (i.e. it might produce false positives) option was added, but this is a step in the wrong direction, in my opinion.

Because our new clustered forward renderer uses a depth pre-pass I was able to implement a wireframe rendering more that works with occlusion culling. Depth data is rendered in the prepass, and the a color wireframe is drawn on top. This allowed me to easily view the occlusion culling results and fine-tune the algorithm to make it perfect. Here are the results:

As you can see, we have pixel-perfect occlusion culling that is completely dynamic and basically zero-cost, because the entire process is performed on the GPU. Awesome!

  • Like 10

9 Comments


Recommended Comments

martyj

Posted

That's really awesome!

Josh

Posted

9 minutes ago, martyj said:

That's really awesome!

Thanks for providing the test scene.

Genebris

Posted

That looks really great. But I worry that CPU performance wasn't ever a bottleneck for me in Leadwerks, it was always GPU. So I'm not sure how helpful it is to move other tasks from CPU to GPU.

Josh

Posted

2 minutes ago, Genebris said:

That looks really great. But I worry that CPU performance wasn't ever a bottleneck for me in Leadwerks, it was always GPU. So I'm not sure how helpful it is to move other tasks from CPU to GPU.

The performance bottleneck was probably the client-side rendering code, which has been pretty much eliminated in the new engine. GPU utilization is now typically 96-99%.

  • Like 1
gamecreator

Posted

I forget if it was ever fixed in Leadwerks but will this avoid the issue where models pop back late when you turn around fast?

Josh

Posted

6 minutes ago, gamecreator said:

I forget if it was ever fixed in Leadwerks but will this avoid the issue where models pop back late when you turn around fast?

That will never been 100% eliminated but the responsiveness is faster now and it can be minimized.

  • Upvote 1
ScarPunk

Posted

Nice feature!

A command like entity->IsDormant() will exist ?

(to check if is rendered)

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...