Name

    ANGLE_clip_cull_distance

Name Strings

    GL_ANGLE_clip_cull_distance

Contributors

    Contributors to EXT_clip_cull_distance
    Members of the WebGL working group

Status

    Draft

Version

    Last Modified Date: December 1, 2022
    Revision: 1

Number

    OpenGL ES Extension XX

Dependencies

    This specification is written against the OpenGL ES 3.2 Specification
    (May 5, 2022), and the OpenGL ES 3.20 Shading Language Specification
    (July 10, 2019) but can apply to prior specifications.

    OpenGL ES 3.0 and OpenGL ES Shading Language 3.00 are required.

Overview

    This extension has the same semantics as EXT_clip_cull_distance but
    the number of supported cull distances may be zero.

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameters of GetBooleanv, GetIntegerv,
    GetInteger64v, and GetFloatv:

        MAX_CLIP_DISTANCES_ANGLE                          0x0D32
        MAX_CULL_DISTANCES_ANGLE                          0x82F9
        MAX_COMBINED_CLIP_AND_CULL_DISTANCES_ANGLE        0x82FA

    Accepted by the <pname> parameters of Enable, Disable and IsEnabled:

        CLIP_DISTANCE0_ANGLE           0x3000
        CLIP_DISTANCE1_ANGLE           0x3001
        CLIP_DISTANCE2_ANGLE           0x3002
        CLIP_DISTANCE3_ANGLE           0x3003
        CLIP_DISTANCE4_ANGLE           0x3004
        CLIP_DISTANCE5_ANGLE           0x3005
        CLIP_DISTANCE6_ANGLE           0x3006
        CLIP_DISTANCE7_ANGLE           0x3007

Additions to OpenGL ES Shading Language 3.20 Specification

    Including the following line in a shader can be used to control
    the language features described in this extension:

        #extension GL_ANGLE_clip_cull_distance : <behavior>

    where <behavior> is as described in section 3.4.

    A new preprocessor #define is added to the OpenGL ES Shading Language:

        #define GL_ANGLE_clip_cull_distance 1

    Other additions follow the EXT_clip_cull_distance specification.

Dependencies on cull distance support

    If cull distances are not supported, querying MAX_CULL_DISTANCES_ANGLE
    and MAX_COMBINED_CLIP_AND_CULL_DISTANCES_ANGLE must return zero, the
    built-in constants gl_MaxCullDistances and gl_MaxCombinedClipAndCullDistances
    are defined as zero, and gl_CullDistance must not be used in shaders.

New State

    Add the following to Table 21.6 (Transformation State):

                                            Initial
    Get Value            Type   Get Command Value    Description       Sec.
    -------------------- ------ ----------- -------- ----------------- ----
    CLIP_DISTANCEi_ANGLE 8* x B IsEnabled   FALSE    ith user clip     12.5
                                                     distance enabled


New Implementation Dependent State

    Add the following to Table 21.40 (Implementation Dependent Values):

                                              Minimum
    Get Value                Type Get Command Value    Description       Sec.
    ------------------------ ---- ----------- -------- ----------------- ----
    MAX_CLIP_DISTANCES_ANGLE Z+   GetIntegerv 8        Max. no. of user  12.5
                                                       clip distances
    MAX_CULL_DISTANCES_ANGLE Z+   GetIntegerv 0        Max. no. of user  12.5
                                                       cull distances
    MAX_COMBINED_CLIP_AND-   Z+   GetIntegerv 0        Max. combined no. 12.5
    _CULL_DISTANCES_ANGLE                              of user clip and
                                                       cull distances

Revision History

    12/1/2022   First revision
