Maybe to illustrate another approach besides raytracing, what about trying to rasterize a curve?
To rasterize any shape, you need to be able to trace the boundary of the shape. and then find pairs of points along horizontal lines across that boundary.
With a triangle, you have 3 points. Think about ways that 3 points could be arranged on the screen. Which one is at the top? Which one is at the bottom? Is the middle one on the left or right side? Is the triangle degenerate (i.e. are all 3 points on a line or on the same pixel)?
There's a bunch of cases to consider, but in general you end up splitting the triangle into an upper wedge (from the top point to the split at the middle), and then a lower wedge from the middle split to the bottom point), and once split into these two wedges it's easy to trace the two boundary lines in parallel (
with some appropriate efficient algorithm) and use those as endpoints of each raster.
So... why not just use curved lines to trace the boundary of a curved shape and rasterize that? Well, in some cases you can: there's
effective circle rasterization algorithms, for example. In this case, it's solving a quadratic equation insted of a linear one, so each step is more complex than the edge of a triangle, but it's still doable.
However, a circle is an exceptionally "simple" case; has perfect symmetry that can be exploited for efficiency, has a very well defined shape and boundary, etc.
Let's think about 3D curves in general, though. What's the simplest curve? Maybe a bi-quadritic patch? i.e. a quad but with an additional piece of curvature data on each axis.
The triangle had a bunch of cases, but ultimately we could split it into two simple wedges. What do we need to do to split a quadratic patch? How do we find its boundary on the screen? This curve isn't contained by the 4 points of the quad, the curve bulges outside it! Does the buldge go left or right, up or down, in or out? Does part of the curve overlap itself from this viewpoint? (Triangles can't do that!) How do I split it to avoid the overlap? Splitting this into rasterizable pieces is not easy!!! We're only at the simplest possible thing above triangles here and there's already a combinatorial explosion of possibilities to deal with. It
can be done, but there's a huge loss of efficiency dealing with all these cases. On top of that, even once you've split it up, tracing/interpolating a curved edge inherently takes more computation than tracing a line, as does interpolating across the raster between the split edges. Every single step of the operation has this added quadratic complexity to it!
The easier to build alternative is basically raytracing. Find a bounding rectangle on the screen that you know will contain all the points of the curve to be rasterized, and then just raytrace every point in that rectangle. This is not that hard to implement, it's just one easily calculated surface intersection, but it's orders of magnitude more computation than rasterization. Not to mention that the bounding rectangle is necessarily wasteful (a lot of the pixels in the bounding rectangle will be off the shape, and ultimately discarded, but you have to do the intersection calculation to determine this). This is an even bigger loss of efficiency, but at least easier to implement.
Then back to subdivision surfaces: it uses the GPU to automatically split a patch into smaller triangles, and then just use regular triangle rasterization. It's the same input data as these two other options, and the result is visually as close as you want to make it, but the subdivision process is relatively easy to implement
and fairly efficient at the same time. You can even do level-of-detail adjustments where close stuff gets subdivided more than far away stuff. It's easy to scale up if you want smoother curves, and just as easy to scale back if you want coarser curves to save computation.