The rasterization of points is controlled with

` void` ** PointSize** ( ` float` * size* ) ` ;`

* size* specifies the width or diameter of a point.
The default value is 1.0.
A value less than or equal to zero results in the error ` INVALID_VALUE`.

Point antialiasing is enabled or disabled by calling
** Enable** or ** Disable**
with the symbolic constant ` POINT_SMOOTH`.
The default state is for point antialiasing to be disabled.

In the default state,
a point is rasterized by truncating its and coordinates
(recall that the subscripts indicate that these are
**x** and **y** window coordinates)
to integers.
This address, along with data derived from the data associated with the
vertex corresponding to the point,
is sent as a single fragment to the per-fragment stage of the GL.

The effect of a point width other than depends on the state of
point antialiasing.
If antialiasing is disabled,
the actual width is determined by rounding the supplied width to
the nearest integer,
then clamping it to the implementation-dependent
maximum non-antialiased point width.
Though this implementation-dependent value cannot be queried,
it must be no less than the implementation-dependent maximum antialiased
point width, rounded to the nearest integer value,
and in any event no less than **1**.
If rounding the specified width results in the value **0**,
then it is as if the value were **1**.
If the resulting width is odd,
then the point

is computed from the vertex's and , and a square grid of the odd width centered at defines the centers of the rasterized fragments (recall that fragment centers lie at half-integer window coordinate values). If the width is even, then the center point is

the rasterized fragment centers are the half-integer window coordinate values within the square of the even width centered on . See Figure 3.2.

**Figure 3.2:** Rasterization of non-antialiased wide points.
The crosses show fragment centers
produced by rasterization for any point that lies
within the shaded region.
The dotted grid lines lie on half-integer coordinates.

All fragments produced in rasterizing a non-antialiased point are assigned
the same associated data,
which are those of the vertex corresponding to the point,
with texture coordinates **s**, **t**, and **r**
replaced with , , and , respectively. If **q** is less then or
equal to zero, the results are undefined.

If antialiasing is enabled,
then point rasterization produces a fragment for each fragment square that intersects
the region lying within the circle having diameter equal to the current
point width and centered at the point's (Figure 3.3).
The coverage value for each fragment is the window coordinate area of the
intersection of the circular region with the corresponding fragment square
(but see section 3.2).
This value is saved and used in the final step of rasterization
(section 3.10).
The data associated with each fragment are otherwise the data associated with
the point being rasterized,
with texture coordinates **s**, **t**, and **r**
replaced with , , and , respectively. If **q** is less then or
equal to zero, the results are undefined.

**Figure 3.3:** Rasterization of antialiased wide points.
The black dot indicates the point to be rasterized.
The shaded region has the specified width.
The X marks indicate those fragment centers produced by rasterization.
A fragment's computed coverage value is based on the portion of the
shaded region that covers the corresponding fragment square.
Solid lines lie on integer coordinates.

Not all widths need be supported when point antialiasing is on, but the width must be provided. If an unsupported width is requested, the nearest supported width is used instead. The range of supported widths and the width of evenly-spaced gradations within that range are implementation dependent. The range and gradations may be obtained using the query mechanism described in Chapter 6. If, for instance, the width range is from 0.1 to 2.0 and the gradation width is 0.1, then the widths are supported.

Sat Mar 29 02:23:21 PST 1997