# gluPerspective.3G - Man Page

set up a perspective projection matrix

## C Specification

void **gluPerspective**( GLdouble *fovy*,

GLdoubleaspect, GLdoublezNear, GLdoublezFar)

## Parameters

*fovy*Specifies the field of view angle, in degrees, in the

*y*direction.*aspect*Specifies the aspect ratio that determines the field of view in the

*x*direction. The aspect ratio is the ratio of*x*(width) to*y*(height).*zNear*Specifies the distance from the viewer to the near clipping plane (always positive).

*zFar*Specifies the distance from the viewer to the far clipping plane (always positive).

## Description

**gluPerspective** specifies a viewing frustum into the world coordinate system. In general, the aspect ratio in **gluPerspective** should match the aspect ratio of the associated viewport. For example, $\text{aspect}\text{\hspace{0.5em}}=\text{\hspace{0.5em}}2.0$ means the viewer's angle of view is twice as wide in *x* as it is in *y*. If the viewport is twice as wide as it is tall, it displays the image without distortion.

The matrix generated by **gluPerspective** is multiplied by the current matrix, just as if **glMultMatrix** were called with the generated matrix. To load the perspective matrix onto the current matrix stack instead, precede the call to **gluPerspective** with a call to **glLoadIdentity**.

Given *f* defined as follows:

$f\text{\hspace{0.5em}}=\text{\hspace{0.5em}}cotangent\text{(}\frac{\text{fovy}}{2}\text{)}$

The generated matrix is

$\left(\text{\hspace{0.5em}}\text{\hspace{0.5em}}\begin{array}{cccc}\hfill \frac{f}{\text{aspect}}\hfill & \hfill 0\hfill & \hfill 0\hfill & \hfill 0\hfill \\ \hfill 0\hfill & \hfill f\hfill & \hfill 0\hfill & \hfill 0\hfill \\ \hfill 0\hfill & \hfill 0\hfill & \hfill \frac{\text{zFar}+\text{zNear}}{\text{zNear}-\text{zFar}}\hfill & \hfill \frac{2*\text{zFar}*\text{zNear}}{\text{zNear}-\text{zFar}}\hfill \\ \hfill 0\hfill & \hfill 0\hfill & \hfill -1\hfill & \hfill 0\hfill \end{array}\text{\hspace{0.5em}}\text{\hspace{0.5em}}\text{\hspace{0.5em}}\right)$

## Notes

Depth buffer precision is affected by the values specified for *zNear* and *zFar*. The greater the ratio of *zFar* to *zNear* is, the less effective the depth buffer will be at distinguishing between surfaces that are near each other. If

$r\text{\hspace{0.5em}}=\text{\hspace{0.5em}}\frac{\text{zFar}}{\text{zNear}}$

roughly ${\text{log}}_{2}r$ bits of depth buffer precision are lost. Because $r$ approaches infinity as *zNear* approaches 0, *zNear* must never be set to 0.

## See Also

glFrustum(3G), glLoadIdentity(3G), glMultMatrix(3G), gluOrtho2D(3G)