One (very slow) method I've used is to sweep through the depth by increasing the ViewRange
gradually, and rasterizing those scenes in black & white. You can then sum the resulting images to produce something that looks like a depth map.
drange = Range[12.0, 18, 0.05];
dimensions = {512, 512};
objects = {Cylinder[{{-1, -1, 0}, {-1, -1, 1}}, .42], Cuboid[],
Polygon[{{-2, -2, 0}, {2, -2, 0}, {2, 2, 0}, {-2, 2, 0}}],
Sphere[{.3, -.6, .5}, .5]};
dmasks = ParallelTable[ColorNegate@ColorConvert[Rasterize[
Graphics3D[{FaceForm[Black], EdgeForm[Black], objects},
Boxed -> False, ViewRange -> {0, r}],
RasterSize -> dimensions], "Grayscale"], {r, drange}];
ImageAdjust@(Image[Total[ImageData /@ dmasks]])

This is of course inadequate for your purposes due to poor performance and low depth resolution.
Another option is to set the VertexColors
of the mesh to a GrayLevel
corresponding to the distance from the camera. This is faster, but it's not accurate as it interpolates the depth. Also there are some artifacts near polygon edges.
camera = {1.3, -2.4, 2.};
scene = Graphics3D[{Cylinder[{{-1, -1, 0}, {-1, -1, 1}}, .42],
Cuboid[],
Polygon[{{-2, -2, 0}, {2, -2, 0}, {2, 2, 0}, {-2, 2, 0}}],
Sphere[{.3, -.6, .5}, .5]}, Boxed -> False, ViewPoint -> camera];
(* get the whole scene as one big mesh *)
polys = TriangulateMesh[ImportString[ExportString[scene, "OBJ"]]];
coords = MeshCoordinates[polys];
cells = MeshCells[polys, 2];
(* get all polygon vertices distances to camera, normalize, and set a GrayLevel *)
distances = GrayLevel /@ Rescale[EuclideanDistance[camera, #] & /@ coords];
(* render the scene with the VertexColors *)
Rasterize[
Graphics3D[{EdgeForm[None], Lighting -> {{"Ambient", White}},
GraphicsComplex[coords, cells, VertexColors -> distances]},
Boxed -> False]] // ColorNegate
