Name

    OES_byte_coordinates

Name Strings

    GL_OES_byte_coordinates

Contact

    Kari Pulli, Nokia (kari.pulli 'at' nokia.com)

Notice

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

Status

    Ratified by the Khronos BOP, July 23, 2003.

Version

    $Date: 2003/07/23 04:23:25 $ $Revision: 1.5 $

Number

    OpenGL ES Extension #4 (formerly OpenGL Extension #291)

Dependencies

    OpenGL 1.1 is required.

Overview

    This extension allows specifying, additionally to all existing 
    values, byte-valued vertex and texture coordinates to be used.

    The main reason for introducing the byte-argument is to allow 
    storing data more compactly on memory-restricted environments.

IP Status

    There is no intellectual property associated with this extension.

Issues

    None known.

New Procedures and Functions

    None

New Tokens

    Accepted by the <type> parameter of VertexPointer and TexCoordPointer

    BYTE     0x1400

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

    Add signed byte entry points to first paragraph of
    section 2.7 (Vertex Specification):

            void Vertex{234}bOES( T coords );
            void Vertex{234}bvOES( T coords );

    and to the second paragraph:

            void TexCoord{1234}bOES( T coords );
            void TexCoord{1234}bvOES( T coords );

    and to the third paragraph:

            void MultiTexCoord{1234}bOES( enum texture, T coords );
            void MultiTexCoord{1234}bvOES( enum texture, T coords );

    Add byte to supported types in Table 2.4 (Vertex Array Sizes):

        Command         Sizes   Types
        VertexPointer   2,3,4   byte,short,int,float,double
        TexCoordPointer 1,2,3,4 byte,short,int,float,double

Additions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization)

    None

Additions to Chapter 4 of the OpenGL 1.3 Specification (Per-Fragment
Operations and the Frame Buffer)

    None

Additions to Chapter 5 of the OpenGL 1.3 Specification (Special Functions)

    None

Additions to Chapter 6 of the OpenGL 1.3 Specification (State and
State Requests)

    None

Additions to Appendix A of the OpenGL 1.3 Specification (Invariance)

    None

Additions to the AGL/GLX/WGL Specifications

GLX Protocol

    Byte type commands are mapped on the client-side to the
    appropriate short or int command protocol.

Errors

    No new errors, giving byte as <type> argument to VertexPointer or
    TexCoordPointer is not an error any more.

New State

(table 6.6, pp. 214-215)

    Get Value      Type      Get Command  Value  Description  Sec.  Attribute
    ---------      ----      -----------  -----  -----------  ----  ---------
   VERTEX_x        Z_5       GetIntegerv  FLOAT  Type of      2.8  vertex-array
                                                 vertex
                                                 coordinates
   TEXTURE_COORD_x 2 * x Z_5 GetIntegerv  FLOAT  Type of      2.8  vertex-array
                                                 texture
                                                 coordinates
  _x = _ARRAY_TYPE

New Implementation Dependent State

    None

Revision History

Sep 23, 2002    Kari Pulli      Created the document
Sep 26, 2002    Kari Pulli      Incorporated comments by Jon Leech
Feb 26, 2003    David Blythe    Changed prefix to OES
Jul 08, 2003    David Blythe    Deleted Dependencies on section, added
                                extension number, narrow state table
Jul 11, 2003    David Blythe    Changed to use OES suffixes
Jul 12, 2003    David Blythe    Added note about GLX protocol
