It’s possible that vtkDiscreteMarchingCubes will give you the desired result, and I think that’s the best place to start. However, it will create inner surfaces between each value in addition to the outer surface. It assumes the values are categorical (e.g. label values) rather than continuous.
A very general (but not very efficient) solution is to apply vtkThreshold to remove all cells with a negative value, followed by vtkGeometryFilter to get the outer surface.