Adaptive Subdivision fails GPU Cycles renders Blender 2.9+. Unnecessary VRAM use

I’ve been working on an animation project for months now, that started in Blender 2.8. The animation includes one photo-real character that I am using a Displacement Map workflow for pores and small skin detail, rather than normal + roughness maps. Basically a Film Res character.

I have 6 subdivision levels I’m working with in Zbrush, and load the lowest into Blender to work on the animation, and then rely on Adaptive Subdivision to tesselate the model throughout the animation depending on the camera’s location. Far away, I do not need all that pore detail as geometry, but in close-ups it definitely makes a difference.

This has caused me an unreasonable amount of trouble shooting time, especially after upgrading to Blender 2.9+. Adaptive Subdiv being active makes my scene impossible to render. As you will see in the images below, there is no reason Adaptive Subdiv should be eating up over 100% of my RTX 2070 Super’s 8GB VRAM, yet it does.

In the images below, I have a fresh scene, where I’ve only loaded my character’s body, adjusted render settings to be more efficient, and then fiddled with the subdivision modifier / render settings. I am using the wireframe node on a base material to visualize the tessellation.

First is Adaptive Subdiv working in 2.83 (though the Max Subdiv render setting does nothing).

Next are images of successful renders using normal Subdivision in Blender 2.92. Here you can see the tessellation working as expected, and reasonable memory usage as the polygon count increases.

The last three images are failed renders using Adaptive Subdivision in Blender 2.92. Regardless of settings configuration, the renders fail with an Optix error. CUDA renders take unreasonably long to build the BVH and often also fail. The memory usage is dramatically more than the normal Subdiv Modifier, even if tessellation should be the same or less.

If anyone has any information that may help, I would really appreciate it. The project is basically done and I’d like to avoid having to version everything down to 2.8 to complete it. Don’t even know if that would work.

(I had to combine all images to one because this is a new account for the forum)

Thank you in advance!

Error:

bpy.context.space_data.context = ‘RENDER’

Failed to build OptiX acceleration structure

OPTIX_ERROR_INVALID_VALUE in optixAccelBuild(context, NULL, &options, &build_input, 1, temp_mem.device_pointer, sizes.tempSizeInBytes, out_data.device_pointer, sizes.outputSizeInBytes, &out_handle, background ? &compacted_size_prop : NULL, background ? 1 : 0) (device_optix.cpp:1208)

SOLUTION:

Finally figured out what has been going on.

For some reason Blender is coded to stack the Standard Subdivision settings ONTOP of the Adaptive Subdivision. So if you uncheck Adaptive Subdivision, and have any subdivisions in the Render Subdivision settings, those subdivs are added along with the adaptive ones.

Set original subdivision settings to 0 before checking Adaptive and it seems to work as expected.

This definitely does not feel intended, and is super unclear for the user. Hope this helps someone else.

5 Likes

Oh my god thank you!!

Thank you! Could not understand why it was crashing no matter what i chose as value for the adaptive.

Thank you – just to be clear, you’re talking about nullifying the value in the modifier and not the subdivision settings in the render properties tab. Am I correct?