| Name |
| |
| EXT_secondary_color |
| |
| Name Strings |
| |
| GL_EXT_secondary_color |
| |
| Version |
| |
| NVIDIA Date: February 24, 2000 |
| $Date: 1999/06/21 19:57:47 $ $Revision: 1.8 $ |
| |
| Number |
| |
| 145 |
| |
| Dependencies |
| |
| Either EXT_separate_specular_color or OpenGL 1.2 is required, to specify |
| the "Color Sum" stage and other handling of the secondary color. This is |
| written against the 1.2 specification (available from www.opengl.org). |
| |
| Overview |
| |
| This extension allows specifying the RGB components of the secondary |
| color used in the Color Sum stage, instead of using the default |
| (0,0,0,0) color. It applies only in RGBA mode and when LIGHTING is |
| disabled. |
| |
| Issues |
| |
| * Can we use the secondary alpha as an explicit fog weighting factor? |
| |
| ISVs prefer a separate interface (see GL_EXT_fog_coord). The current |
| interface specifies only the RGB elements, leaving the option of a |
| separate extension for SecondaryColor4() entry points open (thus |
| the apparently useless ARRAY_SIZE state entry). |
| |
| There is an unpleasant asymmetry with Color3() - one assumes A = |
| 1.0, the other assumes A = 0.0 - but this appears unavoidable given |
| the 1.2 color sum specification language. Alternatively, the color |
| sum language could be rewritten to not sum secondary A. |
| |
| * What about multiple "color iterators" for use with aggrandized |
| multitexture implementations? |
| |
| We may need this eventually, but the secondary color is well defined |
| and a more generic interface doesn't seem justified now. |
| |
| * Interleaved array formats? |
| |
| No. The multiplicative explosion of formats is too great. |
| |
| * Do we want to be able to query the secondary color value? How does it |
| interact with lighting? |
| |
| The secondary color is not part of the GL state in the |
| separate_specular_color extension that went into OpenGL 1.2. There, |
| it can't be queried or obtained via feedback. |
| |
| The secondary_color extension is slightly more general-purpose, so |
| the secondary color is explicitly in the GL state and can be queried |
| - but it's still somewhat limited and can't be obtained via |
| feedback, for example. |
| |
| New Procedures and Functions |
| |
| void SecondaryColor3[bsifd ubusui]EXT(T components) |
| void SecondaryColor3[bsifd ubusui]vEXT(T components) |
| void SecondaryColorPointerEXT(int size, enum type, sizei stride, |
| void *pointer) |
| |
| New Tokens |
| |
| Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, |
| and by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, |
| and GetDoublev: |
| |
| COLOR_SUM_EXT 0x8458 |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, |
| GetFloatv, and GetDoublev: |
| |
| CURRENT_SECONDARY_COLOR_EXT 0x8459 |
| SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A |
| SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B |
| SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C |
| |
| Accepted by the <pname> parameter of GetPointerv: |
| |
| SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D |
| |
| Accepted by the <array> parameter of EnableClientState and |
| DisableClientState: |
| |
| SECONDARY_COLOR_ARRAY_EXT 0x845E |
| |
| Additions to Chapter 2 of the 1.2 Draft Specification (OpenGL Operation) |
| |
| These changes describe a new current state type, the secondary color, and |
| the commands to specify it: |
| |
| - (2.6, p. 12) Second paragraph changed to: |
| |
| "Each vertex is specified with two, three, or four coordinates. In |
| addition, a current normal, current texture coordinates, current |
| color, and current secondary color may be used in processing each |
| vertex." |
| |
| Third paragraph, second sentence changed to: |
| |
| "These associated colors are either based on the current color and |
| current secondary color, or produced by lighting, depending on |
| whether or not lighting is enabled." |
| |
| - 2.6.3, p. 19) First paragraph changed to |
| |
| "The only GL commands that are allowed within any Begin/End pairs |
| are the commands for specifying vertex coordinates, vertex colors, |
| normal coordinates, and texture coordinates (Vertex, Color, |
| SecondaryColorEXT, Index, Normal, TexCoord)..." |
| |
| - (2.7, p. 20) Starting with the fourth paragraph, change to: |
| |
| "Finally, there are several ways to set the current color and |
| secondary color. The GL stores a current single-valued color index |
| as well as a current four-valued RGBA color and secondary color. |
| Either the index or the color and secondary color are significant |
| depending as the GL is in color index mode or RGBA mode. The mode |
| selection is made when the GL is initialized. |
| |
| The commands to set RGBA colors and secondary colors are: |
| |
| void Color[34][bsifd ubusui](T components) |
| void Color[34][bsifd ubusui]v(T components) |
| void SecondaryColor3[bsifd ubusui]EXT(T components) |
| void SecondaryColor3[bsifd ubusui]vEXT(T components) |
| |
| The color command has two major variants: Color3 and Color4. The |
| four value versions set all four values. The three value versions |
| set R, G, and B to the provided values; A is set to 1.0. (The |
| conversion of integer color components (R, G, B, and A) to |
| floating-point values is discussed in section 2.13.) |
| |
| The secondary color command has only the three value versions. |
| Secondary A is always set to 0.0. |
| |
| Versions of the Color and SecondaryColorEXT commands that take |
| floating-point values accept values nominally between 0.0 and |
| 1.0...." |
| |
| The last paragraph is changed to read: |
| |
| "The state required to support vertex specification consists of four |
| floating-point numbers to store the current texture coordinates s, |
| t, r, and q, four floating-point values to store the current RGBA |
| color, four floating-point values to store the current RGBA |
| secondary color, and one floating-point value to store the current |
| color index. There is no notion of a current vertex, so no state is |
| devoted to vertex coordinates. The initial values of s, t, and r of |
| the current texture coordinates are zero; the initial value of q is |
| one. The initial current normal has coordinates (0,0,1). The initial |
| RGBA color is (R,G,B,A) = (1,1,1,1). The initial RGBA secondary |
| color is (R,G,B,A) = (0,0,0,0). The initial color index is 1." |
| |
| - (2.8, p. 21) Added secondary color command for vertex arrays: |
| |
| Change first paragraph to read: |
| |
| "The vertex specification commands described in section 2.7 accept |
| data in almost any format, but their use requires many command |
| executions to specify even simple geometry. Vertex data may also be |
| placed into arrays that are stored in the client's address space. |
| Blocks of data in these arrays may then be used to specify multiple |
| geometric primitives through the execution of a single GL command. |
| The client may specify up to seven arrays: one each to store edge |
| flags, texture coordinates, colors, secondary colors, color indices, |
| normals, and vertices. The commands" |
| |
| Add to functions listed following first paragraph: |
| |
| void SecondaryColorPointerEXT(int size, enum type, sizei stride, |
| void *pointer) |
| |
| Add to table 2.4 (p. 22): |
| |
| Command Sizes Types |
| ------- ----- ----- |
| SecondaryColorPointerEXT 3 byte,ubyte,short,ushort,int,uint, |
| float,double |
| |
| Starting with the second paragraph on p. 23, change to add |
| SECONDARY_COLOR_ARRAY_EXT: |
| |
| "An individual array is enabled or disabled by calling one of |
| |
| void EnableClientState(enum array) |
| void DisableClientState(enum array) |
| |
| with array set to EDGE_FLAG_ARRAY, TEXTURE_COORD_ARRAY, COLOR_ARRAY, |
| SECONDARY_COLOR_ARRAY_EXT, INDEX_ARRAY, NORMAL_ARRAY, or |
| VERTEX_ARRAY, for the edge flag, texture coordinate, color, |
| secondary color, color index, normal, or vertex array, respectively. |
| |
| The ith element of every enabled array is transferred to the GL by |
| calling |
| |
| void ArrayElement(int i) |
| |
| For each enabled array, it is as though the corresponding command |
| from section 2.7 or section 2.6.2 were called with a pointer to |
| element i. For the vertex array, the corresponding command is |
| Vertex<size><type>v, where <size> is one of [2,3,4], and <type> is |
| one of [s,i,f,d], corresponding to array types short, int, float, |
| and double respectively. The corresponding commands for the edge |
| flag, texture coordinate, color, secondary color, color index, and |
| normal arrays are EdgeFlagv, TexCoord<size><type>v, |
| Color<size><type>v, SecondaryColor3<type>vEXT, Index<type>v, and |
| Normal<type>v, respectively..." |
| |
| Change pseudocode on p. 27 to disable secondary color array for |
| canned interleaved array formats. After the lines |
| |
| DisableClientState(EDGE_FLAG_ARRAY); |
| DisableClientState(INDEX_ARRAY); |
| |
| insert the line |
| |
| DisableClientState(SECONDARY_COLOR_ARRAY_EXT); |
| |
| Substitute "seven" for every occurence of "six" in the final paragraph |
| on p. 27. |
| |
| - (2.12, p. 41) Add secondary color to the current rasterpos state. |
| |
| Change the last paragraph to read |
| |
| "The current raster position requires five single-precision |
| floating-point values for its x_w, y_w, and z_w window coordinates, |
| its w_c clip coordinate, and its eye coordinate distance, a single |
| valid bit, a color (RGBA color, RGBA secondary color, and color |
| index), and texture coordinates for associated data. In the initial |
| state, the coordinates and texture coordinates are both $(0,0,0,1)$, |
| the eye coordinate distance is 0, the valid bit is set, the |
| associated RGBA color is $(1,1,1,1)$, the associated RGBA secondary |
| color is $(0,0,0,0)$, and the associated color index color is 1. In |
| RGBA mode, the associated color index always has its initial value; |
| in color index mode, the RGBA color and and secondary color always |
| maintain their initial values." |
| |
| - (2.13, p. 43) Change second paragraph to acknowledge two colors when |
| lighting is disabled: |
| |
| "Next, lighting, if enabled, produces either a color index or |
| primary and secondary colors. If lighting is disabled, the current |
| color index or current color (primary color) and current secondary |
| color are used in further processing. After lighting, RGBA colors |
| are clamped..." |
| |
| - (Figure 2.8, p. 42) Change to show primary and secondary RGBA colors in |
| both lit and unlit paths. |
| |
| - (2.13.1, p. 44) Change so that the second paragraph starts: |
| |
| "Lighting may be in one of two states: |
| |
| 1. Lighting Off. In this state, the current color and current secondary |
| color are assigned to the vertex primary color and vertex secondary |
| color, respectively. |
| |
| 2. ..." |
| |
| - (2.13.1, p. 48) Change the sentence following equation 2.5 (for spot_i) |
| so that color sum is implicitly enabled when SEPARATE_SPECULAR_COLOR is |
| set: |
| |
| "All computations are carried out in eye coordinates. When c_es = |
| SEPARATE_SPECULAR_COLOR, it is as if color sum (see section 3.9) were |
| enabled, regardless of the value of COLOR_SUM_EXT." |
| |
| |
| - (3.9, p. 136) Change the first paragraph to read |
| |
| "After texturing, a fragment has two RGBA colors: a primary color c_pri |
| (which texturing, if enabled, may have modified) and a secondary color |
| c_sec. |
| |
| If color sum is enabled, the components of these two colors are summed |
| to produce a single post-texturing RGBA color c (the A component of the |
| secondary color is always 0). The components of c are then clamped to |
| the range [0,1]. If color sum is disabled, then c_pri is assigned to the |
| post texturing color. Color sum is enabled or disabled using the generic |
| Enable and Disable commands, respectively, with the symbolic constant |
| COLOR_SUM_EXT. |
| |
| The state required is a single bit indicating whether color sum is |
| enabled or disabled. In the initial state, color sum is disabled." |
| |
| Additions to Chapter 6 of the 1.2 Specification (State and State Requests) |
| |
| None |
| |
| Additions to the GLX Specification |
| |
| None |
| |
| GLX Protocol |
| |
| Eight new GL rendering commands are added. The following commands |
| are sent to the server as part of a glXRender request: |
| |
| SecondaryColor3bvEXT |
| 2 8 rendering command length |
| 2 4126 rendering command opcode |
| 1 INT8 v[0] |
| 1 INT8 v[1] |
| 1 INT8 v[2] |
| 1 unused |
| |
| SecondaryColor3svEXT |
| 2 12 rendering command length |
| 2 4127 rendering command opcode |
| 2 INT16 v[0] |
| 2 INT16 v[1] |
| 2 INT16 v[2] |
| 2 unused |
| |
| SecondaryColor3ivEXT |
| 2 16 rendering command length |
| 2 4128 rendering command opcode |
| 4 INT32 v[0] |
| 4 INT32 v[1] |
| 4 INT32 v[2] |
| |
| SecondaryColor3fvEXT |
| 2 16 rendering command length |
| 2 4129 rendering command opcode |
| 4 FLOAT32 v[0] |
| 4 FLOAT32 v[1] |
| 4 FLOAT32 v[2] |
| |
| SecondaryColor3dvEXT |
| 2 28 rendering command length |
| 2 4130 rendering command opcode |
| 8 FLOAT64 v[0] |
| 8 FLOAT64 v[1] |
| 8 FLOAT64 v[2] |
| |
| SecondaryColor3ubvEXT |
| 2 8 rendering command length |
| 2 4131 rendering command opcode |
| 1 CARD8 v[0] |
| 1 CARD8 v[1] |
| 1 CARD8 v[2] |
| 1 unused |
| |
| SecondaryColor3usvEXT |
| 2 12 rendering command length |
| 2 4132 rendering command opcode |
| 2 CARD16 v[0] |
| 2 CARD16 v[1] |
| 2 CARD16 v[2] |
| 2 unused |
| |
| SecondaryColor3uivEXT |
| 2 16 rendering command length |
| 2 4133 rendering command opcode |
| 4 CARD32 v[0] |
| 4 CARD32 v[1] |
| 4 CARD32 v[2] |
| |
| Errors |
| |
| INVALID_VALUE is generated if SecondaryColorPointerEXT parameter <size> |
| is not 3. |
| |
| INVALID_ENUM is generated if SecondaryColorPointerEXT parameter <type> |
| is not BYTE, UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, INT, UNSIGNED_INT, |
| FLOAT, or DOUBLE. |
| |
| INVALID_VALUE is generated if SecondaryColorPointerEXT parameter |
| <stride> is negative. |
| |
| New State |
| |
| (table 6.5, p. 195) |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| --------- ---- ----------- ------------- ----------- --- --------- |
| CURRENT_SECONDARY_COLOR_EXT C GetIntegerv, (0,0,0,0) Current 2.7 current |
| GetFloatv secondary color |
| |
| (table 6.6, p. 197) |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| --------- ---- ----------- ------------- ----------- --- --------- |
| SECONDARY_COLOR_ARRAY_EXT B IsEnabled False Sec. color array enable 2.8 vertex-array |
| SECONDARY_COLOR_ARRAY_SIZE_EXT Z+ GetIntegerv 3 Sec. colors per vertex 2.8 vertex-array |
| SECONDARY_COLOR_ARRAY_TYPE_EXT Z8 GetIntegerv FLOAT Type of sec. color components 2.8 vertex-array |
| SECONDARY_COLOR_ARRAY_STRIDE_EXT Z+ GetIntegerv 0 Stride between sec. colors 2.8 vertex-array |
| SECONDARY_COLOR_ARRAY_POINTER_EXT Y GetPointerv 0 Pointer to the sec. color array 2.8 vertex-array |
| |
| (table 6.8, p. 198) |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| --------- ---- ----------- ------------- ----------- --- --------- |
| COLOR_SUM_EXT B IsEnabled False True if color 3.9 fog/enable |
| sum enabled |