
- •Introduction
- •Formatting of Optional Features
- •What is the OpenGL Graphics System?
- •Our View
- •Companion Documents
- •OpenGL Operation
- •OpenGL Fundamentals
- •Floating-Point Computation
- •GL State
- •GL Command Syntax
- •Basic GL Operation
- •GL Errors
- •Begin/End Paradigm
- •Begin and End
- •Polygon Edges
- •GL Commands within Begin/End
- •Vertex Specification
- •Vertex Arrays
- •Buffer Objects
- •Vertex Arrays in Buffer Objects
- •Array Indices in Buffer Objects
- •Rectangles
- •Coordinate Transformations
- •Controlling the Viewport
- •Matrices
- •Normal Transformation
- •Generating Texture Coordinates
- •Clipping
- •Current Raster Position
- •Colors and Coloring
- •Lighting
- •ColorMaterial
- •Lighting State
- •Color Index Lighting
- •Clamping or Masking
- •Flatshading
- •Color and Associated Data Clipping
- •Final Color Processing
- •Vertex Shaders
- •Shader Objects
- •Program Objects
- •Shader Variables
- •Shader Execution
- •Required State
- •Rasterization
- •Invariance
- •Antialiasing
- •Multisampling
- •Points
- •Basic Point Rasterization
- •Point Rasterization State
- •Point Multisample Rasterization
- •Line Segments
- •Basic Line Segment Rasterization
- •Other Line Segment Features
- •Line Rasterization State
- •Line Multisample Rasterization
- •Polygons
- •Basic Polygon Rasterization
- •Stippling
- •Antialiasing
- •Options Controlling Polygon Rasterization
- •Depth Offset
- •Polygon Multisample Rasterization
- •Polygon Rasterization State
- •Pixel Rectangles
- •Pixel Storage Modes
- •The Imaging Subset
- •Pixel Transfer Modes
- •Rasterization of Pixel Rectangles
- •Pixel Transfer Operations
- •Pixel Rectangle Multisample Rasterization
- •Bitmaps
- •Texturing
- •Compressed Texture Images
- •Texture Parameters
- •Depth Component Textures
- •Cube Map Texture Selection
- •Texture Wrap Modes
- •Texture Completeness
- •Texture State and Proxy State
- •Texture Objects
- •Texture Environments and Texture Functions
- •Texture Comparison Modes
- •Texture Application
- •Color Sum
- •Fragment Shaders
- •Shader Variables
- •Shader Execution
- •Antialiasing Application
- •Multisample Point Fade
- •Per-Fragment Operations
- •Pixel Ownership Test
- •Scissor Test
- •Multisample Fragment Operations
- •Alpha Test
- •Stencil Test
- •Depth Buffer Test
- •Occlusion Queries
- •Blending
- •Dithering
- •Logical Operation
- •Additional Multisample Fragment Operations
- •Whole Framebuffer Operations
- •Selecting a Buffer for Writing
- •Fine Control of Buffer Updates
- •Clearing the Buffers
- •The Accumulation Buffer
- •Drawing, Reading, and Copying Pixels
- •Writing to the Stencil Buffer
- •Reading Pixels
- •Copying Pixels
- •Pixel Draw/Read State
- •Special Functions
- •Evaluators
- •Selection
- •Feedback
- •Display Lists
- •Flush and Finish
- •Hints
- •State and State Requests
- •Querying GL State
- •Simple Queries
- •Data Conversions
- •Enumerated Queries
- •Texture Queries
- •Stipple Query
- •Color Matrix Query
- •Color Table Query
- •Convolution Query
- •Histogram Query
- •Minmax Query
- •Pointer and String Queries
- •Occlusion Queries
- •Buffer Object Queries
- •Shader and Program Queries
- •Saving and Restoring State
- •State Tables
- •Invariance
- •Corollaries
- •Version 1.1
- •Version 1.2
- •Imaging Subset
- •Version 1.2.1
- •Version 1.3
- •Version 1.4
- •Fog Coordinate
- •Texture LOD Bias
- •Version 1.5
- •Version 2.0
- •ARB Extensions
- •Texture Mirrored Repeat
- •OpenGL Shading Language

4.2. WHOLE FRAMEBUFFER OPERATIONS |
212 |
values for each color in the multisample buffer are combined to produce a single color value, and that value is written into the corresponding color buffers selected by DrawBuffer or DrawBuffers. An implementation may defer the writing of the color buffers until a later time, but the state of the framebuffer must behave as if the color buffers were updated as each fragment was processed. The method of combination is not specified, though a simple average computed independently for each color component is recommended.
4.2Whole Framebuffer Operations
The preceding sections described the operations that occur as individual fragments are sent to the framebuffer. This section describes operations that control or affect the whole framebuffer.
4.2.1 Selecting a Buffer for Writing
The first such operation is controlling the color buffers into which each of the fragment colors are written. This is accomplished with either DrawBuffer or DrawBuffers.
The command
void DrawBuffer( enum buf );
defines the set of color buffers to which fragment color zero is written. buf is a symbolic constant specifying zero, one, two, or four buffers for writing. The constants are NONE, FRONT LEFT, FRONT RIGHT, BACK LEFT, BACK RIGHT, FRONT, BACK, LEFT, RIGHT, FRONT AND BACK, and AUX0 through AUXm, where m + 1 is the number of available auxiliary buffers.
The constants refer to the four potentially visible buffers front left, front right, back left, and back right, and to the auxiliary buffers. Arguments other than AUXi that omit reference to LEFT or RIGHT refer to both left and right buffers. Arguments other than AUXi that omit reference to FRONT or BACK refer to both front and back buffers. AUXi enables drawing only to auxiliary buffer i. Each AUXi adheres to AUXi = AUX0 + i. The constants and the buffers they indicate are summarized in table 4.4. If DrawBuffer is is supplied with a constant (other than NONE) that does not indicate any of the color buffers allocated to the GL context, the error
INVALID OPERATION results.
DrawBuffer will set the draw buffer for fragment colors other than zero to
NONE.
The command
Version 2.0 - October 22, 2004

4.2. WHOLE FRAMEBUFFER OPERATIONS |
|
|
213 |
|||||
|
|
|
|
|
|
|
|
|
|
symbolic |
front |
front |
|
back |
back |
aux |
|
|
constant |
left |
right |
|
left |
right |
i |
|
|
|
|
|
|
|
|
|
|
|
NONE |
• |
|
|
|
|
|
|
|
FRONT LEFT |
• |
|
|
|
|
|
|
|
FRONT RIGHT |
|
|
• |
|
|
|
|
|
BACK LEFT |
|
|
|
• |
|
|
|
|
BACK RIGHT |
• |
• |
|
|
|
|
|
|
FRONT |
|
• |
• |
|
|
||
|
BACK |
• |
|
|
|
|
||
|
LEFT |
• |
|
• |
• |
|
|
|
|
RIGHT |
• |
|
• |
|
|
||
|
FRONT AND BACK |
• |
|
• |
• |
|
||
|
AUXi |
|
|
|
|
|
|
Table 4.4: Arguments to DrawBuffer and the buffers that they indicate.
void DrawBuffers( sizei n, const enum *bufs );
defines the draw buffers to which all fragment colors are written. n specifies the number of buffers in bufs. bufs is a pointer to an array of symbolic constants specifying the buffer to which each fragment color is written. The constants may be
NONE, FRONT LEFT, FRONT RIGHT, BACK LEFT, BACK RIGHT, and AUX0 through
AUXm, where m+ 1 is the number of available auxiliary buffers. The draw buffers being defined correspond in order to the respective fragment colors. The draw buffer for fragment colors beyond n is set to NONE.
Except for NONE, a buffer may not appear more then once in the array pointed to by bufs. Specifying a buffer more then once will result in the error
INVALID OPERATION.
If fixed-function fragment shading is being performed, DrawBuffers specifies a set of draw buffers into which the fragment color is written.
If a fragment shader writes to gl FragColor, DrawBuffers specifies a set of draw buffers into which the single fragment color defined by gl FragColor is written. If a fragment shader writes to gl FragData, DrawBuffers specifies a set of draw buffers into which each of the multiple fragment colors defined by gl FragData are separately written. If a fragment shader writes to neither gl FragColor nor gl FragData, the values of the fragment colors following shader execution are undefined, and may differ for each fragment color.
The maximum number of draw buffers is implementation dependent and must be at least 1. The number of draw buffers supported can be queried by calling
Version 2.0 - October 22, 2004

4.2. WHOLE FRAMEBUFFER OPERATIONS |
214 |
GetIntegerv with the symbolic constant MAX DRAW BUFFERS. |
|
The constants FRONT, BACK, LEFT, RIGHT, and FRONT AND BACK |
are not |
valid in the bufs array passed to DrawBuffers, and will result in the error INVALID OPERATION. This restriction is because these constants may themselves refer to multiple buffers, as shown in table 4.4.
If DrawBuffers is supplied with a constant (other than NONE) that does not indicate any of the color buffers allocated to the GL context, the error INVALID OPERATION will be generated. If n is greater than the value of
MAX DRAW BUFFERS, the error INVALID VALUE will be generated.
Indicating a buffer or buffers using DrawBuffer or DrawBuffers causes subsequent pixel color value writes to affect the indicated buffers.
Specifying NONE as the draw buffer for an fragment color will inhibit that fragment color from being written to any buffer.
Monoscopic contexts include only left buffers, while stereoscopic contexts include both left and right buffers. Likewise, single buffered contexts include only front buffers, while double buffered contexts include both front and back buffers. The type of context is selected at GL initialization.
The state required to handle color buffer selection is an integer for each supported fragment color. In the initial state, the draw buffer for fragment color zero is FRONT if there are no back buffers; otherwise it is BACK. The initial state of draw buffers for fragment colors other then zero is NONE.
4.2.2 Fine Control of Buffer Updates
Four commands are used to mask the writing of bits to each of the logical framebuffers after all per-fragment operations have been performed. The commands
void IndexMask( uint mask );
void ColorMask( boolean r, boolean g, boolean b, boolean a );
control the color buffer or buffers (depending on which buffers are currently indicated for writing). The least significant n bits of mask, where n is the number of bits in a color index buffer, specify a mask. Where a 1 appears in this mask, the corresponding bit in the color index buffer (or buffers) is written; where a 0 appears, the bit is not written. This mask applies only in color index mode. In RGBA mode, ColorMask is used to mask the writing of R, G, B and A values to the color buffer or buffers. r, g, b, and a indicate whether R, G, B, or A values, respectively, are written or not (a value of TRUE means that the corresponding value is written). In the initial state, all bits (in color index mode) and all color values (in RGBA mode) are enabled for writing.
Version 2.0 - October 22, 2004

4.2. WHOLE FRAMEBUFFER OPERATIONS |
215 |
The depth buffer can be enabled or disabled for writing zw values using
void DepthMask( boolean mask );
If mask is non-zero, the depth buffer is enabled for writing; otherwise, it is disabled. In the initial state, the depth buffer is enabled for writing.
The commands
void StencilMask( uint mask );
void StencilMaskSeparate( enum face, uint mask );
control the writing of particular bits into the stencil planes.
The least significant s bits of mask comprise an integer mask (s is the number of bits in the stencil buffer), just as for IndexMask. The face parameter of StencilMaskSeparate can be FRONT, BACK, or FRONT AND BACK and indicates whether the front or back stencil mask state is affected. StencilMask sets both front and back stencil mask state to identical values.
Fragments generated by front facing primitives use the front mask and fragments generated by back facing primitives use the back mask (see section 4.1.5). The clear operation always uses the front stencil write mask when clearing the stencil buffer.
The state required for the various masking operations is three integers and a bit: an integer for color indices, an integer for the front and back stencil values, and a bit for depth values. A set of four bits is also required indicating which color components of an RGBA value should be written. In the initial state, the integer masks are all ones, as are the bits controlling depth value and RGBA component writing.
Fine Control of Multisample Buffer Updates
When the value of SAMPLE BUFFERS is one, ColorMask, DepthMask, and StencilMask or StencilMaskSeparate control the modification of values in the multisample buffer. The color mask has no effect on modifications to the color buffers. If the color mask is entirely disabled, the color sample values must still be combined (as described above) and the result used to replace the color values of the buffers enabled by DrawBuffer.
4.2.3 Clearing the Buffers
The GL provides a means for setting portions of every pixel in a particular buffer to the same value. The argument to
Version 2.0 - October 22, 2004

4.2. WHOLE FRAMEBUFFER OPERATIONS |
216 |
|||||
|
void Clear( bitfield buf ); |
|
||||
is |
the |
bitwise |
OR of |
a number |
of values indicating |
which buffers are |
to |
be |
cleared. |
The |
values are |
COLOR BUFFER BIT, |
DEPTH BUFFER BIT, |
STENCIL BUFFER BIT, and ACCUM BUFFER BIT, indicating the buffers currently enabled for color writing, the depth buffer, the stencil buffer, and the accumulation buffer (see below), respectively. The value to which each buffer is cleared depends on the setting of the clear value for that buffer. If the mask is not a bitwise OR of the specified values, then the error INVALID VALUE is generated.
void ClearColor( clampf r, clampf g, clampf b, clampf a );
sets the clear value for the color buffers in RGBA mode. Each of the specified components is clamped to [0, 1] and converted to fixed-point according to the rules of section 2.14.9.
void ClearIndex( float index );
sets the clear color index. index is converted to a fixed-point value with unspecified precision to the left of the binary point; the integer part of this value is then masked with 2m − 1, where m is the number of bits in a color index value stored in the framebuffer.
void ClearDepth( clampd d );
takes a floating-point value that is clamped to the range [0, 1] and converted to fixed-point according to the rules for a window z value given in section 2.11.1. Similarly,
void ClearStencil( int s );
takes a single integer argument that is the value to which to clear the stencil buffer. s is masked to the number of bitplanes in the stencil buffer.
void ClearAccum( float r, float g, float b, float a );
takes four floating-point arguments that are the values, in order, to which to set the R, G, B, and A values of the accumulation buffer (see the next section). These values are clamped to the range [−1, 1] when they are specified.
When Clear is called, the only per-fragment operations that are applied (if enabled) are the pixel ownership test, the scissor test, and dithering. The masking
Version 2.0 - October 22, 2004