Conceptually, you can think of render-to-texture as being like
rendering a scene into a hidden window, and then copying the contents of the
window into a texture. Such hidden
windows are not actually called windows, they're called "buffers."
Furthermore, the data is usually not copied into the texture, it's
usually transferred into the texture using a more efficient mechanism.
Details aside, though, if you think of it as rendering into a hidden window
and then copying into a texture, you have a pretty accurate idea of what
Render-to-texture is particularly useful when you'd like to apply a "filter"
to your scene. If you've ever used Photoshop, you know what a filter is:
Photoshop has lots of interesting filters that do blurring, texturizing,
edge detection, and more. The first step in implementing a filter is to
render the entire scene into a texture. Then, the texture is applied to
a full-screen quad and displayed in a window. So far, it looks the same
as if you simply rendered the scene into the window. However, by applying
a shader to the full-screen quad, you can implement your filter.
There are several other interesting uses for render-to-texture: water
reflections, environment mapping, creating virtual televisions, shadow
mapping... the list is quite long.
The Low-Level API and the High-Level Utilities
Panda3D contains a very low-level API for creating offscreen buffers,
creating render-target textures, and the like. This low-level API is
extremely flexible: it gives you a great deal of control over
what kinds of buffers you create, over what gets rendered into them,
over how the data gets transferred to a texture, and so forth. The
advantage of using the low-level API is that you can control everything.
The disadvantage is that you have to control everything, and there's
a lot of stuff to control.
Panda3D also provides a number of utilities that make it convenient
to use render-to-texture for certain specific applications. For
example, there is a utility that helps set up common image filters.
There is another that helps set up cube-map
environment maps. The downside of these utilities is that each one
performs a fairly specific function, and if there isn't one for your
particular application, you'll need to resort to the lower-level API.
In the following sections, we document the high-level utilities first,
because these are what most people are going to use. If none of the
utilities does what you need, then the last subsection explains the