Phong reflection is an empirical model of local illumination. It describes the way a surface reflects light as a combination of the
diffuse reflection of rough surfaces with the
specular reflection of shiny surfaces. It is based on Phong's informal observation that shiny surfaces have small intense
specular highlights, while dull surfaces have large highlights that fall off more gradually. The model also includes an
ambient term to account for the small amount of light that is scattered about the entire scene. For each light source in the scene, components i_\text{s} and i_\text{d} are defined as the intensities (often as
RGB values) of the specular and diffuse components of the light sources, respectively. A single term i_\text{a} controls the ambient lighting; it is sometimes computed as a sum of contributions from all light sources. For each
material in the scene, the following parameters are defined: :k_\text{s}, which is a specular reflection constant, the ratio of reflection of the specular term of incoming light, :k_\text{d}, which is a diffuse reflection constant, the ratio of reflection of the diffuse term of incoming light (
Lambertian reflectance), :k_\text{a}, which is an ambient reflection constant, the ratio of reflection of the ambient term present in all points in the scene rendered, and :\alpha, which is a
shininess constant for this material, which is larger for surfaces that are smoother and more mirror-like. When this constant is large the specular highlight is small. Furthermore, there is :\text{lights}, which is the
set of all light sources, :\hat{L}_m, which is the direction vector from the point on the surface toward each light source (m specifies the light source), :\hat{N}, which is the
normal at this point on the surface, :\hat{R}_m, which is the direction that a perfectly reflected ray of light would take from this point on the surface, and :\hat{V}, which is the direction pointing towards the viewer (such as a virtual camera). Then the Phong reflection model provides an equation for computing the illumination of each surface point I_\text{p}: :I_\text{p} = k_\text{a} i_\text{a} + \sum_{m\;\in\;\text{lights}} (k_\text{d} (\hat{L}_m \cdot \hat{N}) i_{m,\text{d}} + k_\text{s} (\hat{R}_m \cdot \hat{V})^{\alpha}i_{m,\text{s}}). where the direction vector \hat{R}_m is calculated as the
reflection of \hat{L}_m on the surface characterized by the surface normal \hat{N} using :\hat{R}_m = 2(\hat{L}_m\cdot \hat{N})\hat{N} - \hat{L}_m The hats indicate that the vectors are
normalized. The diffuse term is not affected by the viewer direction (\hat{V}). The specular term is large only when the viewer direction (\hat{V}) is aligned with the reflection direction \hat{R}_m. Their alignment is measured by the \alpha power of the cosine of the angle between them. The cosine of the angle between the normalized vectors \hat{R}_m and \hat{V} is equal to their
dot product. When \alpha is large, in the case of a nearly mirror-like reflection, the specular highlight will be small, because any viewpoint not aligned with the reflection will have a cosine less than one which rapidly approaches zero when raised to a high power. Although the above formulation is the common way of presenting the Phong reflection model, each term should only be included if the term's dot product is positive. (Additionally, the specular term should only be included if the dot product of the diffuse term is positive.) When the color is represented as
RGB values, as often is the case in
computer graphics, this equation is typically modeled separately for R, G and B intensities, allowing different reflection constants k_\text{a}, k_\text{d} and k_\text{s} for the different
color channels. When implementing the Phong reflection model, there are a number of methods for approximating the model, rather than implementing the exact formulas, which can speed up the calculation; for example, the
Blinn–Phong reflection model is a modification of the Phong reflection model, which is more efficient if the viewer and the light source are treated to be at infinity. Another approximation that addresses the calculation of the exponentiation in the specular term is the following: Considering that the specular term should be taken into account only if its dot product is positive, it can be approximated as :\max(0, \hat{R}_m \cdot \hat{V})^\alpha = \max(0, 1-\lambda)^{\beta \gamma} = \left(\max(0,1-\lambda)^\beta\right)^\gamma \approx \max(0, 1 - \beta \lambda)^\gamma where \lambda = 1 - \hat{R}_m \cdot \hat{V}, and \beta = \alpha / \gamma\, is a
real number which doesn't have to be an
integer. If \gamma is chosen to be a power of 2, i.e. \gamma = 2^n where n is an integer, then the expression (1 - \beta\lambda)^\gamma can be more efficiently calculated by squaring (1 - \beta\lambda)\ n times, i.e. :(1 - \beta\lambda)^\gamma \,=\, (1 - \beta\lambda)^{2^n} \,=\, (1 - \beta\lambda)^{\overbrace{\scriptstyle 2\,\cdot\,2\,\cdot\,\dots\,\cdot\,2}^n} \,=\, (\dots((1 - \beta\lambda)\overbrace{^2)^2\dots)^2}^n. This approximation of the specular term holds for a sufficiently large integer \gamma (typically, 4 or 8 will be enough). Furthermore, the value \lambda can be approximated as \lambda = (\hat{R}_m - \hat{V})\cdot(\hat{R}_m - \hat{V}) / 2, or as \lambda = (\hat{R}_m \times \hat{V})\cdot(\hat{R}_m \times \hat{V}) / 2. The latter is much less sensitive to normalization errors in \hat{R}_m and \hat{V} than Phong's dot-product-based \lambda = 1 - \hat{R}_m \cdot \hat{V} is, and practically doesn't require \hat{R}_m and \hat{V} to be normalized except for very low-resolved triangle meshes. This method substitutes a few multiplications for a variable exponentiation, and removes the need for an accurate reciprocal-square-root-based vector normalization. == Inverse model ==