To show that there's more than one way to skin a cat, here's another primitive-based method, using NURBS surfaces to render a hemisphere:
With[{r = 1},
Graphics3D[{EdgeForm[],
BSplineSurface[Outer[Append[First[#1] #2, Last[#1]] &,
r {{0, 1}, {1, 1}, {1, 0}},
{{1, 0}, {1, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {1, -1}, {1, 0}}, 1],
SplineClosed -> {False, True}, SplineDegree -> 2,
SplineKnots -> {{0, 0, 0, 1, 1, 1},
{0, 0, 0, 1/4, 1/2, 1/2, 3/4, 1, 1, 1}},
SplineWeights -> Outer[Times, {1, 1/Sqrt[2], 1},
{1, 1/2, 1/2, 1, 1/2, 1/2, 1}]]},
BaseStyle -> {BSplineSurface3DBoxOptions ->
{Method -> {"SplinePoints" -> 40}}}, Boxed -> False]]

Change r
to vary the radius; the control points in the first argument of BSplineSurface[]
can be translated and rotated, if the hemisphere needs to be positioned/oriented differently.
If you're interested in this sort of thing, you can refer to work by Piegl and Tiller, e.g. this paper and their book.
Here's another NURBS representation of a hemisphere:
With[{r = 1},
Graphics3D[{EdgeForm[],
BSplineSurface[Outer[Insert[First[#1] #2, Last[#1], 2] &,
r {{0, -1}, {1, -1}, {1, 1}, {0, 1}},
{{-1, 0}, {-1, 1}, {1, 1}, {1, 0}}, 1],
SplineDegree -> 2,
SplineKnots -> {{0, 0, 0, 1/2, 1, 1, 1},
{0, 0, 0, 1/2, 1, 1, 1}},
SplineWeights -> Outer[Times, {1, 1/2, 1/2, 1},
{1, 1/2, 1/2, 1}]]},
BaseStyle -> {BSplineSurface3DBoxOptions ->
{Method -> {"SplinePoints" -> 40}}}, Boxed -> False]]

N.B. The previous version of this answer featured BSplineSurface[]
objects with noticeable blemishes; this turned out to be due to insufficient internal sampling. Adding the option BaseStyle -> {BSplineSurface3DBoxOptions -> {Method -> {"SplinePoints" -> 40}}}
(similar to what Mr. Wizard did here) minimizes the blemishes to a barely noticeable spot.
RegionFunction
) is shown here. $\endgroup$