1
$\begingroup$

I would like to know what common techniques are used for rendering large models, when using rasterisation within a graphics API, for example OpenGL or Vulkan.

For example if I had a model with >10 million triangles, and it would be too slow to render the whole model, what optimisation steps or techniques could I use?

I am currently aware of:

  • Frustum culling
  • Occlusion culling

I would not know how to apply frustum culling to a single model. I know it can be used for multiple models:

for( int i=0; i < numObjects; i++ )
{
    if( insideFrustrum( objects[i] )
    {
        addModelToBeRendered( objects[i] );
    }
}
  1. Can frustum culling be applied to a single model/mesh?
  2. What other techniques besides the two stated can be used when rendering large data-sets?
$\endgroup$
  • 2
    $\begingroup$ It entirely depends on what type of renderer you're talking about. Techniques appropriate to ray-tracing aren't necessarily appropriate to triangle rasterisation, and vice-versa. If you're using scanline rasterisation, are you asking from the POV of someone designing a GPU, implementing OpenGL (or similar) in software, or writing an application that sends triangles to an OpenGL implementation? $\endgroup$ – Dan Hulme Jun 27 at 10:46
  • 1
    $\begingroup$ @DanHulme I have edited the post with more specific details. (Rasterisation when using a graphics API like OpenGL or Vulkan) $\endgroup$ – tester Jun 27 at 13:09
1
$\begingroup$

The straightforward solution is to simple not render the high poly model at all. Have a lower detail model that you can switch to once the model is too far away for it to make a difference. There is no point in rendering 20 triangles that all end up in the same pixel.

Next option is to partition the model and then cull the individual parts. You can also make each (set of) patch have different Levels of detail.

This partition can take the form of patches that are mostly flat. That way you can use backface culling on the whole group by taking the dot product of the average normal and comparing it to the look vector, if it is too large only the backsides will be showing and there is no point in rendering that patch.

$\endgroup$
  • $\begingroup$ Great thanks, do you know where could I find information on some common partition methods? $\endgroup$ – tester Jun 27 at 22:13
0
$\begingroup$

My first thought (aside from culling) is to perform some sort of distance based level of detail algorithm. I've heard of systems in the past that could selectively remove edges and merge faces to produce lower detail sections on a single mesh, but most systems go for the far simpler method of simply loading in an entirely separate lower detail model once the higher detail model moves far enough from the camera.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.