The objective of this step is to find a transformation matrix to transform points expressed in normalized device coordinates to screen coordinates

$$ \mathbf{v}_{screen} = \mathbf{M}_{vp} \mathbf{v}_{ndc} $$

The canonical view volume needs to be mapped to the screen that has $n_x \times n_y$ pixels in a way so that points with $x = -1, x = 1$ are mapped to the left and right sides of the screen respectively and $y = -1, y = 1$ are mapped to the bottom and top sides of the screen respectively, the $z$ coordinate isn’t visible in a 2D image so it can be discarded for the mapping

Since the mapping is linear we can use the linear interpolation method

$$ f(x) = out_{lo} + (out_{hi} - out_{lo}) \frac{x - in_{lo}}{ in_{hi} - in_{lo} } $$

Given

  • $out_{lo} = -0.5$
  • $out_{hi} = n_x - 0.5$
  • $in_{lo} = -1$
  • $in_{hi} = 1$

The value of $x_{screen}$ is

$$ \begin{align*} x_{screen} &= -0.5 + n_x \frac{x_{ndc} + 1}{2} \\ &= -\frac{1}{2} + \frac{n_x}{2}x_{ndc} + \frac{n_x}{2} \\ &= \frac{n_x}{2}x_{ndc} + \frac{n_x - 1}{2} \end{align*} $$

The value of $y_{screen}$ is found in a similar way

$$ y_{screen} = \frac{n_y}{2}y_{ndc} + \frac{n_y - 1}{2} $$

Finally the transformation matrix that converts points from NDC to screen coordinates is

$$ \mathbf{M}_{vp} = \begin{bmatrix} \frac{n_x}{2} & 0 & 0 & \frac{n_x - 1}{2} \\ 0 & \frac{n_y}{2} & 0 &\frac{n_y - 1}{2} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} $$

Note that the $z$-coordinate doesn’t need to be modified since it doesn’t affect the projection in the image, the $z$-coordinate is still used to check the order in which objects should be drawn