Multiple Render Targets
In the field of 3D computer graphics, Multiple Render Targets, or MRT, is a feature of modern graphics processing units (GPUs) that allows the programmable rendering pipeline to render images to multiple render target textures at once. These textures can then be used as inputs to other shaders or as texture maps applied to 3D models. Introduced by OpenGL 2.0 and Direct3D 9, MRT can be invaluable to real-time 3D applications such as video games. Before the advent of MRT, a programmer would have to issue a command to the GPU to draw the 3D scene once for each render target texture, resulting in redundant vertex transformations which, in a real-time program expected to run as fast as possible, can be quite time-consuming. With MRT, a programmer creates a pixel shader that returns an output value for each render target. This pixel shader then renders to all render targets with a single draw command.
A common use of MRT is deferred shading, a shading process which, unlike forward shading, performs lighting calculations on an entire 3D scene at once instead of on each individual object. To do this in real-time, MRT is used to store the required information for the lighting calculations in multiple render targets, which are then used after the entire scene has been drawn to calculate the lit final image. Typically one render target holds color and surface information of objects, while another contains the surface normals and depth information of the scene which are used to calculate the reflection of light. Additional render targets can be used to store information such as the specularity of the surface and ambient occlusion data.