Path: cantaloupe.srv.cs.cmu.edu!ph From: ph+@cs.cmu.edu (Paul Heckbert) Newsgroups: comp.sys.sgi.graphics Subject: edge highlighting, offset man page (2/5) Date: 22 Nov 1996 21:28:31 GMT Organization: School of Computer Science, Carnegie Mellon Copyright 1996 by Silicon Graphics Inc man page from IRIX 6.2 (more explanatory than earlier versions) glPolygonOffsetEXT(3G) OpenGL Reference glPolygonOffsetEXT(3G) NAME glPolygonOffsetEXT - set parameters used to offset polygon depth C SPECIFICATION void glPolygonOffsetEXT( GLfloat factor, GLfloat bias ) PARAMETERS factor specifies a slope scale factor. bias specifies a constant bias. The depth values for each subsequent polygon rendered in GL_FILL mode will be offset by the the slope scale factor times the maximum absolute depth slope of the polygon, plus the bias. DESCRIPTION When GL_POLYGON_OFFSET_EXT is enabled, the depth value of each pixel fragment generated for a polygon rendered in GL_FILL mode is offset by an amount that depends on the maximum absolute depth slope of the polygon. This is useful for rendering hidden line images, for applying decals to surfaces, and for rendering solids with highlighted edges. For example, an application might attempt to highlight the edges of a polygon by drawing the polygon with mode GL_FILL and then drawing the polygon again in a different color with mode GL_LINE. However, because of differences in the way lines and polygons are rasterized, the depth values generated for pixels on a line between two vertices are usually not the same as the depth values generated for a polygon edge between the same two vertices. The result is ``stitching'' or other objectionable rendering artifacts along the edges. This can be eliminated by adding an appropriate offset to the depth values so that the filled part of the polygon is cleanly separated from the highlighted edges. At first glance it might appear sufficient to adjust the polygon depth by a constant amount. However, it turns out that there is no single constant offset that works for all the polygons in a scene. The reason is that the depth value at a given pixel may be derived from a polygon sample point nearly one full pixel away from the mathematically-precise edge of the polygon. Therefore, the correct offset must be at least as large as the maximum absolute change in depth for any one-pixel step on the face of the polygon. In the following discussion, let dz represent this change in depth. In the example above, the width of the lines used to highlight the polygon edges was not specified. If the width was one, then the analysis in the previous paragraph shows that an offset equal to dz is sufficient to keep the line and the polygon edge separated. However, if the width was two, then it would be necessary to offset at least twice as much as dz. Therefore, the correct offset must be a multiple of dz, where the scale factor is a function of the width of the highlight line. However, even this is not sufficient. If a polygon is at a constant depth, then dz is zero, so an additional bias is required to ensure that the highlight lines and the underlying polygon remain separated in that case. glPolygonOffsetEXT allows the application to define the proper scale factor (factor) and additional bias (bias). The value of the offset derived from these parameters is factor * dz + bias, where the GL computes dz automatically for each polygon. Initially GL_POLYGON_OFFSET_FACTOR_EXT (the value specified by factor) and GL_POLYGON_OFFSET_BIAS_EXT (the value specified by bias) are both set to 0.0. NOTES Since factor is always used to scale dz, it can be chosen without regard for the precision with which depth values are represented in the graphics system. However, if the value chosen for bias is smaller than the minimum representable difference in depth values, it will have no effect. This minimum representable difference varies not only with the size of the depth buffer, but also with other implementation-dependent parameters, such as the number of guard bits that are used to prevent overflow during rasterization. 0.00002 (somewhat larger than 1 / 2**16) should be adequate for most systems, but may be so large that it causes depth buffering artifacts on others. 0.000001 (somewhat larger than 1 / 2**20) might be a reasonable choice on systems with 24-bit depth buffers. glPolygonOffsetEXT is part of the EXT_polygon_offset extension, not part of the core GL command set. If GL_EXT_polygon_offset is included in the string returned by glGetString, when called with argument GL_EXTENSIONS, extension EXT_polygon_offset is supported by the connection. ERRORS GL_INVALID_OPERATION is generated if glPolygonOffsetEXT is executed between the execution of glBegin and the corresponding execution of glEnd. ASSOCIATED GETS glIsEnabled with argument GL_POLYGON_OFFSET_EXT glGet with argument GL_POLYGON_OFFSET_FACTOR_EXT or GL_POLYGON_OFFSET_BIAS_EXT. SEE ALSO glDepthFunc, glDisable, glEnable, glGet, glIsEnabled, glLineWidth, glReferencePlaneSGIX, glStencilOp, glTexEnv.