In the previous section, we introduced the IRenderer interface. Every implementation of IRenderer has a single job, and that is to render the scene graph. That is its sole responsibility, nothing else. The nodes of the scene graph are technology and device independent representations of what should go on the screen (or more generally, the surface). The job of the renderer is to recurse through the nodes of the scene graph and appropriately render them using an appropriate technology.
Where the scene graph is device independent, the renderer can be entirely device dependent, if you so choose. You can, if you want, take advantage of hardware acceleration and specialized functions offered by particular video cards. To do this, you need to write your own custom renderer.