Name

    ARB_vertex_blend

Name Strings

    GL_ARB_vertex_blend

Contact

    Evan Hart, NVIDIA (ehart 'at' nvidia.com)
    Tom Frisinger, AMD (tom.frisinger 'at' amd.com)

Notice

    Copyright (c) 2000-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Complete. Approved by ARB on September 19, 2000.

Version

    Last Modified Date: November 4, 2006
    Revision: 1.3

Number

    ARB Extension #15

Dependencies

    OpenGL 1.0 is required.
    This extension is written against the OpenGL 1.2.1 Specification.

Overview

    This extension provides the ability to replace the single
    modelview transformation with a set of n vertex units. (Where
    n is constrained to an implementation defined maximum.) Each
    unit has its own modelview transform matrix. For each unit,
    there is a current weight associated with the vertex. When
    this extension is enabled the vertices are transformed by
    the modelview matrices of all of the enabled units. Afterward,
    these results are scaled by the weights for the respective
    units and then summed to create the eye-space vertex. A
    similar procedure is followed for the normals, except they
    are transformed by the inverse transpose of the modelview
    matrices.

    This extension is an orthoganalized version of functionality
    already provided by other 3D graphics API's.

    
IP Status

    Unknown, but believed to be none. 

Issues


    Should an indexed form of matrix addressing be used?

        No, this should be added as an additional extension.

    Should integer blending weights be allowed?

        Yes, this was an over-sight in the original spec. Integer
        formats allow for the potential to provide smaller data
        types to the API. Integer data types are always mapped
        to floats in the same manner as colors.

    Should the blending weights be forced to sum to 1?

        No, it should be provided as a convenience to developers,
        since it is the most common case. Additionally, it should
        be noted that even if the weights do not sum to one,
        the result of the modelview transformation provides an
        eye coordinate whose homogenous coordinate is equivalent
        to the homogeneous coordinate after the transformation
        had the weights been scaled to sum to one.

        Additionally, NORMALIZE should in general be left on to
        prevent non-unit normals.
    
    What about projective modelview matrices?  

        Projective modelview matrices can cause problems with many
        other features in GL, so this should not be a problem in
        practice. This extension makes no attempts to handle
        projective modelview matrices.

    Should the set of modelview matrices affect parts of GL other
      than vertices?

        No, this seems to confuse the operation, and it forces
        vertex components to affect setting of GL state.
      
    Some transformations may cause the normals to be transformed in
      such a way that they no longer represent the tangent plane to
      the surface.

        This is a basic property of the math of the technique. In
        general with these varying transformations, it is impossible
        to maintain the normal as the tangent plane to the surface
        without topological information. 

        Lacking the topological data, the best approximation is to
        transform the normals by the inverse transpose of the
        blend of the modelview matrices. As the inverse per-vertex
        may be computationally impractical, a slightly less accurate
        blend of inverse transpose matrices is allowed as the
        transformation.

        When the less accurate blend is used, the normals will only
        be identical to the normals formed by the more correct math
        when the blending matrices are pair-wise orthogonal and
        the sum of the square of the weights is equal to one.
        
    Should weights be specified as vectors rather than independent
      scalars?

        Yes, this removes little flexibility and significantly
        reduces the call overhead.


New Procedures and Functions

    void Weight{bsifd ubusui}vARB(int size, T* weights)

    void WeightPointerARB(int size, enum type, sizei stride,
                          void *pointer)

    void VertexBlendARB(int count)


New Tokens

    Accepted by the <value> parameters of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

      MAX_VERTEX_UNITS_ARB            0x86A4
      ACTIVE_VERTEX_UNITS_ARB         0x86A5

    Accepted by the <cap> parameters of Enable and Disable, by the
    <value> parameter of IsEnabled, GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

      WEIGHT_SUM_UNITY_ARB            0x86A6
      VERTEX_BLEND_ARB                0x86A7

    Accepted by the <mode> parameter of MatrixMode and by the
    <value> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
    GetDoublev.

      MODELVIEW0_ARB:                 0x1700 (alias to MODELVIEW)
      MODELVIEW1_ARB:                 0x850a
      MODELVIEW2_ARB:                 0x8722
      MODELVIEW3_ARB:                 0x8723
      MODELVIEW4_ARB:                 0x8724
      MODELVIEW5_ARB:                 0x8725
      MODELVIEW6_ARB:                 0x8726
      MODELVIEW7_ARB:                 0x8727
      MODELVIEW8_ARB:                 0x8728
      MODELVIEW9_ARB:                 0x8729
      MODELVIEW10_ARB:                0x872A
      MODELVIEW11_ARB:                0x872B
      MODELVIEW12_ARB:                0x872C
      MODELVIEW13_ARB:                0x872D
      MODELVIEW14_ARB:                0x872E
      MODELVIEW15_ARB:                0x872F
      MODELVIEW16_ARB:                0x8730
      MODELVIEW17_ARB:                0x8731
      MODELVIEW18_ARB:                0x8732
      MODELVIEW19_ARB:                0x8733
      MODELVIEW20_ARB:                0x8734
      MODELVIEW21_ARB:                0x8735
      MODELVIEW22_ARB:                0x8736
      MODELVIEW23_ARB:                0x8737
      MODELVIEW24_ARB:                0x8738
      MODELVIEW25_ARB:                0x8739
      MODELVIEW26_ARB:                0x873A
      MODELVIEW27_ARB:                0x873B
      MODELVIEW28_ARB:                0x873C
      MODELVIEW29_ARB:                0x873D
      MODELVIEW30_ARB:                0x873E
      MODELVIEW31_ARB:                0x873F
      
    Accepted by the <value> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:
    
      CURRENT_WEIGHT_ARB              0x86A8 
      
    Accepted by the <value> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

      WEIGHT_ARRAY_TYPE_ARB           0x86A9
      WEIGHT_ARRAY_STRIDE_ARB         0x86AA
      WEIGHT_ARRAY_SIZE_ARB           0x86AB

    Accepted by the <pname> parameter of GetPointerv:
      WEIGHT_ARRAY_POINTER_ARB        0x86AC

    Accepted by the <cap> parameters of EnableClientState and
    DisableClientState, by the <value> parameter of IsEnabled,
    GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev:

      WEIGHT_ARRAY_ARB                0x86AD

Additions to Chapter 2 of the OpenGL 1.2.1 Specification (Operation)

    - (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 a set of current weights
          may be used in processing each vertex. Normals are used
          by the GL in lighting calculations; the current normal is
          a three-dimensional vector that may be set by sending three
          coordinates that specify it. Texture coordinates determine
          how a texture image is mapped onto a primitive. Weights are
          used to blend between vertex transformations."

    - (2.6.3, p. 19) First paragraph changed to:

          "The only GL commands that are allowed within Begin/End
          pairs are the commands for specifying vertex coordinates,
          vertex color, normal coordinates, texture coordinates, and
          weights (Vertex, Color, Index, Normal, TexCoord,
          WeightvARB), the ArrayElement command (see section 2.8),
          the EvalCoord and EvalPoint commands (see section 5.1),
          commands for specifying lighting material parameters
          (Material commands; see section 2.13.2), display list
          invocation commands (CallList and CallLists; see section
          5.4), and the EdgeFlag command. Executing any other GL
          command between the execution of Begin and the
          corresponding execution of End results in the error
          INVALID_OPERATION. Executing Begin after Begin has already
          been executed but before an End is executed generates the
          INVALID_OPERATION error, as does executing End without a
          previous corresponding Begin." 

    - (2.7, p. 20) Added after the third paragraph:

          "The current weights are set using

              void Weight{bsifd ubusui}vARB(int size, T* weights);

          the floating point values are assigned to the current
                  weight vector. The first <size> current weights are
                  replaced with <weights> such that:
                  
                      w[i] = <weights>[i]
                 
                  When WEIGHT_SUM_UNITY_ARB is enabled, 
                  
                                              <size>-1 
                      w[<size>] = 1 - SUM <weights>[i]
                                                          i=0

                  otherwise the rest of the current weights are set to
                  0. If <size> is greater than MAX_VERTEX_UNITS_ARB or if
                  WEIGHT_SUM_UNITY_ARB is enabled and <size> equals
                  MAX_VERTEX_UNITS_ARB, then the error INVALID_VALUE is
                  generated. When the values are supplied as byte, short,
                  int, or their unsigned counterparts, they are converted to
                  floating-point values as indicated for the corresponding
                  type in Table 2.6."

    - (2.8, p. 21) First paragraph changed 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 an implementation dependent set of
          arrays: one each to store edge flags, texture coordinates,
          colors, color indices, normals, vertices, and weights.
                  The commands

              void EdgeFlagPointer( sizei stride, void *pointer);

              void TexCoordPointer( int size, enum type, sizei stride,
                void *pointer );

              void ColorPointer( int size, enum type, sizei stride,
                void *pointer );

              void IndexPointer( enum type, sizei stride, void 
                *pointer );

              void NormalPointer( enum type, sizei stride, void
                *pointer );

              void VertexPointer( int size, enum type, sizei stride,
                void *pointer );

              void WeightPointerARB( int size, enum type,
                            sizei stride, void *pointer)

          describe the locations and organizations of these arrays.
          For each command, type specifies the data type of the
          values stored in the array. Because edge flags are always
          type boolean, EdgeFlagPointer has no type argument. Size,
          when present, indicates the number of values per vertex
          that are stored in the array. Because normals are always
          specified with three values, NormalPointer has no size
          argument. Likewise, because color indices, edge flags, and
          weights are always specified with a single value,
          IndexPointer, and EdgeFlagPointer also have no size
                  argument. Table 2.4 indicates the allowable values for size
                  and type (when present). For type the values BYTE, SHORT,
                  INT, FLOAT, and DOUBLE indicates types byte, short, int,
                  float, and double, respectively; and the values
                  UNSIGNED_BYTE, UNSIGNED_SHORT, and UNSIGNED_INT indicate
                  types ubyte, ushort, and uint, respectively. The error
                  INVALID_VALUE is generated if size is specified with
                  a value other than that indicated in the table, or if the
                  <size> parameter to WeightPointerARB is outside the range
                  allowed for WeightvARB in section 2.7."
         
    - (2.8, p. 22) Change table 2.4 to read:

          Command            Sizes    Types                     
          -------            -----    -----
          VertexPointer      2,3,4    short, int, float, double
          NormalPointer      3        byte, short, int, float, double
          ColorPointer       3,4      byte, ubyte, short, ushort,
                                      int, uint, float, double
          IndexPointer       1        ubyte, short, int, float,
                                      double
          TexCoordPointer    1,2,3,4  short, int, float, double
          EdgeFlagPointer    1        boolean
          WeightPointerARB   1 ...    byte, ubyte, short, ushort,
                         MAX_VERTEX_UNITS_ARB int, uint, float, double


    - (2.8 p. 23) Change paragraph two to:

          "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, INDEX_ARRAY, NORMAL_ARRAY, VERTEX_ARRAY, or
          WEIGHT_ARRAY_ARB, for the edge flag, texture coordinate,
          color, color index, normal, vertex, or weight array,
          respectively."

    - (2.8 p. 23) Change paragraph three to:

          "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 form section 2.7 or 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, color index, normal, and weight arrays
          are EdgeFlagv, TexCoord[size][type]v, Color[size][type]v,
          Index[type]v, Normal[type]v, and Weight[type]vARB,
          respectively. The <size> parameter to WeightvARB is the
                  current <size> for the weight array. If the vertex array
                  is enabled, it is as though Vertex[size][type]v is executed
                  last, after the executions of the other corresponding
                  commands."

    - (2.10 p. 28) Added after the second paragraph:

          "Alternatively, the model-view transformation may be
          performed by a set of model-view matrices when vertex
          blending is enabled. Enabling and disabling of vertex
          blending is handled by Enable or Disable with the argument
          of VERTEX_BLEND_ARB. When blending is enabled, the vertex
          is transformed by multiple model-view transformations.
                  The number of active transformations applied is set by

                      void VertexBlendARB(int count)
                  
                  where count is the number of transformations to blend.
                  If count is greater than the implementation defined
                  maximum number of transformations reported in 
                  MAX_VERTEX_UNITS_ARB, then the error
                  INVALID_VALUE is generated."

    - (2.10 p. 29) Add after the second paragraph:

          "When vertex blending is enabled, the vertex's eye
          coordinates are found as:

            (xe)    n-1               (xo)
            (ye)  =  SUM  w_i * M_i * (yo)
            (ze)    i=0               (zo)
            (we)                      (wo)

          where M_i is the i'th model-view matrix, w_i is the
                  vertex's associated weight for vertex unit i, 

                        and

                        n = ACTIVE_VERTEX_UNITS_ARB
                        "

    - (2.10.2 p. 31) Change the first paragraph to:

          "The projection matrix and model-view matrices are set
          with a variety of commands. The affected matrix is
          determined by the current matrix mode. The current
          matrix mode is set with

            void MatrixMode( enum mode );

          which takes one of the pre-defined constants TEXTURE,
          MODELVIEW, COLOR, PROJECTION, or MODELVIEWn_ARB. TEXTURE
          is described later in section 2.10.2, and COLOR is
          described in section 3.6.3. If the current matrix mode is
          MODELVIEW, the matrix operations apply to the model-view
          matrix; if PROJECTION, then they apply to the projection
          matrix; if MODLEVIEWn_ARB, then they apply to the n'th
          model-view matrix. MODELVIEW0_ARB is aliased to
          MODELVIEW."  

        - (2.10.2 p. 34) Changed the second paragraph to read:

              "There is a stack of matrices for each of the matrix
                  modes. For MODELVIEWn mode, the stack depth is at least 32
                  (that is, there is a stack of at least 32 MODELVIEWn
                  matrices). Additionally, all modelview matrices must
                  have the same stack depth. ..."

        - (2.10.2 p. 34) Changed the third paragraph to read:

              "... and a stack of at least 32 4 x 4 matrices with an
                  associated stack pointer for each MODELVIEWn. ..."
          

    - (2.10.3 p. 35) Added after the third paragraph:

          "When vertex blending is enabled, the normal is transformed
          to eye space by:

                                              n-1
              (nx' ny' nz') = (nx ny nz) Inv ( SUM w_i * Mu_i)
                                              i=0
          
            Alternatively implementations may choose to transform the
          normal to eye-space by:
          
                              n-1
              (nx' ny' nz') =  SUM w_i * (nx ny nz) Inv(Mu_i)
                              i=0

          where Mu_i is the upper leftmost 3x3 matrix taken from the
          model-view for vertex unit i, w_i is the vertex's
          associated weight for vertex unit i, and

                        n = ACTIVE_VERTEX_UNITS_ARB"


    - (2.10.3 p. 36) Added after the second paragraph:

          "When vertex blending is enabled, rescaling is applied
          within each vertex unit independently. The rescale factor
          for each unit is derived from the modelview matrix for that
          unit. Normalization is applied to the transformed, blended
          normal."

Additions to Chapter 3:

      None

Additions to Chapter 4:

      None

Additions to Chapter 5:

      None 

Additions to Chapter 6:

      None

Additions to the GLX Specification

      None

GLX Protocol

    Nine new GL rendering commandsl are added. The following commands
    are sent to the server as part of a glXRender request:

           WeightbvARB

                2    8+n    rendering command length
                2    220    rendering command opcode
                4    INT32  size
                1*n  INT8   weights
           
           WeightubvARB

                2    8+n    rendering command length
                2    221    rendering command opcode
                4    INT32  size
                1*n  CARD8  weights
           
           WeightsvARB

                2    8+2*n  rendering command length
                2    222    rendering command opcode
                4    INT32  size
                2*n  INT16  weights

           WeightusvARB

                2    8+2*n  rendering command length
                2    223    rendering command opcode
                4    INT32  size
                2*n  CARD16 weights

           WeightivARB

                2    8+4*n  rendering command length
                2    224    rendering command opcode
                4    INT32  size
                4*n  INT32  weights

           WeightuivARB

                2    8+4*n  rendering command length
                2    225    rendering command opcode
                4    INT32  size
                4*n  CARD32 weights

           VertexBlendARB

                2    8      rendering command length
                2    226    rendering command opcode
                4    INT32  count

        WeightfvARB

            2           8+4*n           rendering command length
            2           227             rendering command opcode
            4           INT32           size
            4*n         FLOAT32         weights

        WeightdvARB

            2           8+8*n           rendering command length
            2           228             rendering command opcode
            4           INT32           size
            8*n         FLOAT64         weights

Errors
      
      INVALID_VALUE is generated if the <size> parameter for
          WeightvARB or WeightPointerARB is greater than
          MAX_VERTEX_UNITS_ARB, or if WEIGHT_SUM_UNITY_ARB is enabled
          and <size> is equal to MAX_VERTEX_UNITS_ARB

          INVALID_VALUE is generated if the <count> parameter to
          VertexBlendARB is greater than MAX_VERTEX_UNITS_ARB or
      if <count> is equal to zero.

New State

      Modified State in Table 6.5:

Get Value                Get Command Type     Initial Value Attribute
---------                ----------- ----     ------------- ---------
CURRENT_WEIGHT_ARB       GetFloatv   Rn       n=0 - 1.0     current
                                              n>0 - 0.0 
    
      Modified State in Table 6.6:

Get Value                 Get Command Type   Initial Value Attribute
---------                 ----------- ----   ------------- --------- 
WEIGHT_ARRAY_ARB          IsEnabled   1*B    False         vert-array
WEIGHT_ARRAY_TYPE_ARB     GetIntegerv 1*Z2   FLOAT         vert-array
WEIGHT_ARRAY_SIZE_ARB     GetIntegerv 1*Z+   0             vert-array
WEIGHT_ARRAY_STRIDE_ARB   GetIntegerv 1*Z+   0             vert-array
WEIGHT_ARRAY_POINTER_ARB  GetPointerv 1*Y    0             vert-array


      Modified state in Table 6.7:

Get Value                Get Command Type     Initial Value Attribute
---------                ----------- ----     ------------- ---------
MODELVIEWn_ARB           GetFloatv   1*32*xM4 Identity          -
ACTIVE_VERTEX_UNITS_ARB  GetIntegerv Z+       1             transform
VERTEX_BLEND_ARB         IsEnabled   B        False         transform
                                                            enable

      Modified state in Table 6.25:

Get Value                Get Command Type     Minmum Value  Attribute
---------                ----------- ----     ------------  ---------
MAX_VERTEX_UNITS_ARB     GetIntegerv Z+       2                 -

Additions to Appendix A:

      None

Revision History

  * 1.0 (October 16, 2000) - initial version

  * 1.1 (March 12, 2002) - added GLX protocol for Weight[df]v

  * 1.2 (March 21, 2002) - correct Weightdv protocol

  * 1.3 (November 4, 2006) - updated contact info after ATI/AMD merger
