WebGL

Khronos

WebGL 2.0 명세

Editor’s Draft Thu Feb 19 12:22:35 2026 -0800

이 버전:
https://www.khronos.org/registry/webgl/specs/latest/2.0/
WebIDL: https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl2.idl
최신 버전:
https://www.khronos.org/registry/webgl/specs/latest/2.0/
WebIDL: https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl2.idl
이전 버전:
https://registry.khronos.org/webgl/specs/2.0.0/
WebIDL: https://registry.khronos.org/webgl/specs/2.0.0/webgl2.idl
편집자:
Kelsey Gilbert (Mozilla Corp.)
Copyright © 2015 Khronos Group

초록

이것은 WebGL 명세의 Version 2.0이다.

이 명세는 HTML 5 canvas 요소 [CANVAS]를 위한 추가 렌더링 컨텍스트와 지원 객체들을 설명한다. 이 컨텍스트는 OpenGL ES 3.0 API에 밀접하게 부합하는 API를 사용하여 렌더링할 수 있게 한다.

이 문서는 WebGL 1.0 명세의 확장으로 읽어야 한다. 1.0과의 차이점만 설명한다.

이 문서의 상태

이 문서는 editor's draft이다. 진행 중인 작업 이외의 것으로 이 문서를 인용하지 말라.

피드백

이 명세에 대한 공개 논의는 [email protected] mailing list (instructions, archives)에서 환영한다.

명세 또는 해당 conformance tests에 대한 bugs는 issue tracker에 제출하라. Pull requests는 Github repository에 대해 환영한다.

목차

소개

WebGL™은 웹을 위해 설계된 immediate mode 3D rendering API이다. 이것은 WebGL 명세의 Version 2이다. OpenGL® ES 3.0에서 파생되었으며, 유사한 렌더링 기능을 제공하지만 HTML context에서 제공한다.

WebGL 2.0은 WebGL 1.0과 완전히 backwards compatible하지는 않다. extensions 없이 core WebGL 1.0 명세에 대해 작성된 기존 error-free content는 종종 수정 없이 WebGL 2.0에서 실행되지만, 항상 그런 것은 아니다. backwards compatibility에 대한 모든 예외는 Backwards Incompatibility 섹션에 기록되어 있다. 이 명세에서 제공하는 새 동작에 접근하려면, content가 명시적으로 새 context를 요청한다(아래 세부사항).

규약

이 문서에 설명된 많은 함수에는 OpenGL ES man pages에 대한 links가 포함되어 있다. 이러한 pages가 OpenGL ES 3.0 명세 [GLES30]와 일치하도록 모든 노력을 기울였지만, 오류가 포함될 수 있다. 모순이 있는 경우 OpenGL ES 3.0 명세가 최종 권위이다.

이 문서의 나머지 섹션은 OpenGL ES 3.0 명세(이 문서 작성 시점의 3.0.6, Khronos OpenGL ES API Registry에서 이용 가능)와 함께 읽도록 의도되었다. 달리 지정되지 않는 한, 각 method의 동작은 OpenGL ES 3.0 명세에 의해 정의된다. 이 명세는 interoperability 또는 security를 보장하기 위해 OpenGL ES 3.0과 다를 수 있으며, OpenGL ES 3.0이 implementation-defined로 남겨 둔 영역을 종종 정의한다. 이러한 차이점은 WebGL과 OpenGL ES 3.0의 차이점 섹션에 요약되어 있다.

WebGL 2.0에서 Core로 이동한 Extension 기능

다음 WeGL 1.0 extensions는 WebGL 2.0에서 core인 기능을 반영하므로, WebGL 2.0에서는 더 이상 extensions가 아니다:

Context Creation 및 Drawing Buffer Presentation

WebGL API를 사용하기 전에, 작성자는 아래 설명된 대로 주어진 HTMLCanvasElement [CANVAS] 또는 OffscreenCanvas [OFFSCREENCANVAS]에 대한 WebGLRenderingContext 객체를 얻어야 한다. 이 객체는 OpenGL state를 관리하고 drawing buffer에 렌더링하는 데 사용되며, drawing buffer는 context creation 시점에 생성되어야 한다.

Context Creation

WebGLRenderingContextWebGL2RenderingContext는 생성 시 설정되는 연관된 canvas를 가지며, 이는 canvas [CANVAS] 또는 offscreen canvas [OFFSCREENCANVAS]이다.

WebGLRenderingContextWebGL2RenderingContext는 생성 시 설정되는 context creation parametersWebGLContextAttributes 객체 안에 가진다.

WebGLRenderingContextWebGL2RenderingContext는 drawing buffer가 생성될 때마다 설정되는 actual context parametersWebGLContextAttributes 객체 안에 가진다.

WebGLRenderingContextWebGL2RenderingContext는 처음에는 설정되어 있지 않은 webgl context lost flag를 가진다.

canvas 요소의 getContext() method가 contextId webgl2 [CANVASCONTEXTS]에 대해 새 객체를 반환해야 할 때, user agent는 다음 단계를 수행해야 한다:

  1. WebGL2RenderingContext 객체 context를 생성한다.
  2. contextcanvasgetContext() method가 연관된 canvas 또는 offscreen canvas로 둔다.
  3. WebGLContextAttributes 객체 contextAttributes를 생성한다.
  4. getContext()가 두 번째 인수 options와 함께 호출되었다면, contextAttributes의 attributes를 options에 지정된 것들로 설정한다.
  5. contextAttributes에 지정된 settings를 사용하여 drawing buffer를 생성하고, drawing buffercontext와 연관시킨다.
  6. drawing buffer creation이 실패하면, 다음 단계를 수행한다:
    1. canvas에서 WebGL context creation error를 fire한다.
    2. null을 반환하고 이 단계를 종료한다.
  7. WebGLContextAttributes 객체 actualAttributes를 생성한다.
  8. 새로 생성된 drawing buffer의 properties를 기반으로 actualAttributes의 attributes를 설정한다.
  9. contextcontext creation parameterscontextAttributes로 설정한다.
  10. contextactual context parametersactualAttributes로 설정한다.
  11. context를 반환한다.

Drawing Buffer

WebGL 1.0과 달리, WebGL 2.0의 depth, stencil, 및 antialias attributes는 WebGL 구현에 의해 반드시 준수되어야 한다.

DOM Interfaces

이 섹션은 위에 설명된 기능에 대한 runtime access를 지원하기 위해 DOM에 추가된 interfaces와 기능을 설명한다.

Types

다음 types가 WebGL 2.0에서 도입된다.

typedef long long GLint64;
typedef unsigned long long GLuint64;

WebGLQuery

WebGLQuery 인터페이스는 OpenGL Query Object를 나타낸다. 기저 객체는 glGenQueries를 호출한 것처럼 생성되고 (OpenGL ES 3.0.6 §2.14, man page) , glBeginQuery를 호출한 것처럼 active가 되며 (OpenGL ES 3.0.6 §2.14, man page) , glEndQuery를 호출한 것처럼 concluded되고 (OpenGL ES 3.0.6 §2.14, man page) glDeleteQueries를 호출한 것처럼 destroyed된다 (OpenGL ES 3.0.6 §2.14, man page) .

[Exposed=(Window,Worker)]
interface WebGLQuery : WebGLObject {
};

WebGLSampler

WebGLSampler 인터페이스는 OpenGL Sampler Object를 나타낸다. 기저 객체는 glGenSamplers를 호출한 것처럼 생성되고 (OpenGL ES 3.0.6 §3.8.2, man page) , glBindSampler를 호출한 것처럼 bound되며 (OpenGL ES 3.0.6 §3.8.2, man page) glDeleteSamplers를 호출한 것처럼 destroyed된다 (OpenGL ES 3.0.6 §3.8.2, man page) .

[Exposed=(Window,Worker)]
interface WebGLSampler : WebGLObject {
};

WebGLSync

WebGLSync 인터페이스는 OpenGL Sync Object를 나타낸다. 기저 객체는 glFenceSync를 호출한 것처럼 생성되고 (OpenGL ES 3.0.6 §5.2, man page) , glClientWaitSync를 호출한 것처럼 blocked on되며 (OpenGL ES 3.0.6 §5.2.1, man page) , glWaitSync를 호출한 것처럼 GL 내부에서 waited on되고 (OpenGL ES 3.0.6 §5.2.1, man page) , glGetSynciv를 호출한 것처럼 queried되며 (OpenGL ES 3.0.6 §6.1.8, man page) , glDeleteSync를 호출한 것처럼 destroyed된다 (OpenGL ES 3.0.6 §5.2, man page) .

[Exposed=(Window,Worker)]
interface WebGLSync : WebGLObject {
};

WebGLTransformFeedback

WebGLTransformFeedback 인터페이스는 OpenGL Transform Feedback Object를 나타낸다. 기저 객체는 glGenTransformFeedbacks를 호출한 것처럼 생성되고 (OpenGL ES 3.0.6 §2.15.1, man page) , glBindTransformFeedback를 호출한 것처럼 bound되며 (OpenGL ES 3.0.6 §2.15.1, man page) glDeleteTransformFeedbacks를 호출한 것처럼 destroyed된다 (OpenGL ES 3.0.6 §2.15.1, man page) .

[Exposed=(Window,Worker)]
interface WebGLTransformFeedback : WebGLObject {
};

WebGLVertexArrayObject

WebGLVertexArrayObject 인터페이스는 OpenGL Vertex Array Object를 나타낸다. 기저 객체는 glGenVertexArrays를 호출한 것처럼 생성되고 (OpenGL ES 3.0.6 §2.10, man page) , glBindVertexArray를 호출한 것처럼 bound되며 (OpenGL ES 3.0.6 §2.10, man page) glDeleteVertexArrays를 호출한 것처럼 destroyed된다 (OpenGL ES 3.0.6 §2.10, man page) .

[Exposed=(Window,Worker)]
interface WebGLVertexArrayObject : WebGLObject {
};

WebGL 컨텍스트

WebGL2RenderingContext는 canvas 요소에 OpenGL ES 3.0 스타일 렌더링을 가능하게 하는 API를 나타낸다.

typedef ([AllowShared] Uint32Array or sequence<GLuint>) Uint32List;

interface mixin WebGL2RenderingContextBase
{
  const GLenum READ_BUFFER                                   = 0x0C02;
  const GLenum UNPACK_ROW_LENGTH                             = 0x0CF2;
  const GLenum UNPACK_SKIP_ROWS                              = 0x0CF3;
  const GLenum UNPACK_SKIP_PIXELS                            = 0x0CF4;
  const GLenum PACK_ROW_LENGTH                               = 0x0D02;
  const GLenum PACK_SKIP_ROWS                                = 0x0D03;
  const GLenum PACK_SKIP_PIXELS                              = 0x0D04;
  const GLenum COLOR                                         = 0x1800;
  const GLenum DEPTH                                         = 0x1801;
  const GLenum STENCIL                                       = 0x1802;
  const GLenum RED                                           = 0x1903;
  const GLenum RGB8                                          = 0x8051;
  const GLenum RGB10_A2                                      = 0x8059;
  const GLenum TEXTURE_BINDING_3D                            = 0x806A;
  const GLenum UNPACK_SKIP_IMAGES                            = 0x806D;
  const GLenum UNPACK_IMAGE_HEIGHT                           = 0x806E;
  const GLenum TEXTURE_3D                                    = 0x806F;
  const GLenum TEXTURE_WRAP_R                                = 0x8072;
  const GLenum MAX_3D_TEXTURE_SIZE                           = 0x8073;
  const GLenum UNSIGNED_INT_2_10_10_10_REV                   = 0x8368;
  const GLenum MAX_ELEMENTS_VERTICES                         = 0x80E8;
  const GLenum MAX_ELEMENTS_INDICES                          = 0x80E9;
  const GLenum TEXTURE_MIN_LOD                               = 0x813A;
  const GLenum TEXTURE_MAX_LOD                               = 0x813B;
  const GLenum TEXTURE_BASE_LEVEL                            = 0x813C;
  const GLenum TEXTURE_MAX_LEVEL                             = 0x813D;
  const GLenum MIN                                           = 0x8007;
  const GLenum MAX                                           = 0x8008;
  const GLenum DEPTH_COMPONENT24                             = 0x81A6;
  const GLenum MAX_TEXTURE_LOD_BIAS                          = 0x84FD;
  const GLenum TEXTURE_COMPARE_MODE                          = 0x884C;
  const GLenum TEXTURE_COMPARE_FUNC                          = 0x884D;
  const GLenum CURRENT_QUERY                                 = 0x8865;
  const GLenum QUERY_RESULT                                  = 0x8866;
  const GLenum QUERY_RESULT_AVAILABLE                        = 0x8867;
  const GLenum STREAM_READ                                   = 0x88E1;
  const GLenum STREAM_COPY                                   = 0x88E2;
  const GLenum STATIC_READ                                   = 0x88E5;
  const GLenum STATIC_COPY                                   = 0x88E6;
  const GLenum DYNAMIC_READ                                  = 0x88E9;
  const GLenum DYNAMIC_COPY                                  = 0x88EA;
  const GLenum MAX_DRAW_BUFFERS                              = 0x8824;
  const GLenum DRAW_BUFFER0                                  = 0x8825;
  const GLenum DRAW_BUFFER1                                  = 0x8826;
  const GLenum DRAW_BUFFER2                                  = 0x8827;
  const GLenum DRAW_BUFFER3                                  = 0x8828;
  const GLenum DRAW_BUFFER4                                  = 0x8829;
  const GLenum DRAW_BUFFER5                                  = 0x882A;
  const GLenum DRAW_BUFFER6                                  = 0x882B;
  const GLenum DRAW_BUFFER7                                  = 0x882C;
  const GLenum DRAW_BUFFER8                                  = 0x882D;
  const GLenum DRAW_BUFFER9                                  = 0x882E;
  const GLenum DRAW_BUFFER10                                 = 0x882F;
  const GLenum DRAW_BUFFER11                                 = 0x8830;
  const GLenum DRAW_BUFFER12                                 = 0x8831;
  const GLenum DRAW_BUFFER13                                 = 0x8832;
  const GLenum DRAW_BUFFER14                                 = 0x8833;
  const GLenum DRAW_BUFFER15                                 = 0x8834;
  const GLenum MAX_FRAGMENT_UNIFORM_COMPONENTS               = 0x8B49;
  const GLenum MAX_VERTEX_UNIFORM_COMPONENTS                 = 0x8B4A;
  const GLenum SAMPLER_3D                                    = 0x8B5F;
  const GLenum SAMPLER_2D_SHADOW                             = 0x8B62;
  const GLenum FRAGMENT_SHADER_DERIVATIVE_HINT               = 0x8B8B;
  const GLenum PIXEL_PACK_BUFFER                             = 0x88EB;
  const GLenum PIXEL_UNPACK_BUFFER                           = 0x88EC;
  const GLenum PIXEL_PACK_BUFFER_BINDING                     = 0x88ED;
  const GLenum PIXEL_UNPACK_BUFFER_BINDING                   = 0x88EF;
  const GLenum FLOAT_MAT2x3                                  = 0x8B65;
  const GLenum FLOAT_MAT2x4                                  = 0x8B66;
  const GLenum FLOAT_MAT3x2                                  = 0x8B67;
  const GLenum FLOAT_MAT3x4                                  = 0x8B68;
  const GLenum FLOAT_MAT4x2                                  = 0x8B69;
  const GLenum FLOAT_MAT4x3                                  = 0x8B6A;
  const GLenum SRGB                                          = 0x8C40;
  const GLenum SRGB8                                         = 0x8C41;
  const GLenum SRGB8_ALPHA8                                  = 0x8C43;
  const GLenum COMPARE_REF_TO_TEXTURE                        = 0x884E;
  const GLenum RGBA32F                                       = 0x8814;
  const GLenum RGB32F                                        = 0x8815;
  const GLenum RGBA16F                                       = 0x881A;
  const GLenum RGB16F                                        = 0x881B;
  const GLenum VERTEX_ATTRIB_ARRAY_INTEGER                   = 0x88FD;
  const GLenum MAX_ARRAY_TEXTURE_LAYERS                      = 0x88FF;
  const GLenum MIN_PROGRAM_TEXEL_OFFSET                      = 0x8904;
  const GLenum MAX_PROGRAM_TEXEL_OFFSET                      = 0x8905;
  const GLenum MAX_VARYING_COMPONENTS                        = 0x8B4B;
  const GLenum TEXTURE_2D_ARRAY                              = 0x8C1A;
  const GLenum TEXTURE_BINDING_2D_ARRAY                      = 0x8C1D;
  const GLenum R11F_G11F_B10F                                = 0x8C3A;
  const GLenum UNSIGNED_INT_10F_11F_11F_REV                  = 0x8C3B;
  const GLenum RGB9_E5                                       = 0x8C3D;
  const GLenum UNSIGNED_INT_5_9_9_9_REV                      = 0x8C3E;
  const GLenum TRANSFORM_FEEDBACK_BUFFER_MODE                = 0x8C7F;
  const GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS    = 0x8C80;
  const GLenum TRANSFORM_FEEDBACK_VARYINGS                   = 0x8C83;
  const GLenum TRANSFORM_FEEDBACK_BUFFER_START               = 0x8C84;
  const GLenum TRANSFORM_FEEDBACK_BUFFER_SIZE                = 0x8C85;
  const GLenum TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN         = 0x8C88;
  const GLenum RASTERIZER_DISCARD                            = 0x8C89;
  const GLenum MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A;
  const GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS       = 0x8C8B;
  const GLenum INTERLEAVED_ATTRIBS                           = 0x8C8C;
  const GLenum SEPARATE_ATTRIBS                              = 0x8C8D;
  const GLenum TRANSFORM_FEEDBACK_BUFFER                     = 0x8C8E;
  const GLenum TRANSFORM_FEEDBACK_BUFFER_BINDING             = 0x8C8F;
  const GLenum RGBA32UI                                      = 0x8D70;
  const GLenum RGB32UI                                       = 0x8D71;
  const GLenum RGBA16UI                                      = 0x8D76;
  const GLenum RGB16UI                                       = 0x8D77;
  const GLenum RGBA8UI                                       = 0x8D7C;
  const GLenum RGB8UI                                        = 0x8D7D;
  const GLenum RGBA32I                                       = 0x8D82;
  const GLenum RGB32I                                        = 0x8D83;
  const GLenum RGBA16I                                       = 0x8D88;
  const GLenum RGB16I                                        = 0x8D89;
  const GLenum RGBA8I                                        = 0x8D8E;
  const GLenum RGB8I                                         = 0x8D8F;
  const GLenum RED_INTEGER                                   = 0x8D94;
  const GLenum RGB_INTEGER                                   = 0x8D98;
  const GLenum RGBA_INTEGER                                  = 0x8D99;
  const GLenum SAMPLER_2D_ARRAY                              = 0x8DC1;
  const GLenum SAMPLER_2D_ARRAY_SHADOW                       = 0x8DC4;
  const GLenum SAMPLER_CUBE_SHADOW                           = 0x8DC5;
  const GLenum UNSIGNED_INT_VEC2                             = 0x8DC6;
  const GLenum UNSIGNED_INT_VEC3                             = 0x8DC7;
  const GLenum UNSIGNED_INT_VEC4                             = 0x8DC8;
  const GLenum INT_SAMPLER_2D                                = 0x8DCA;
  const GLenum INT_SAMPLER_3D                                = 0x8DCB;
  const GLenum INT_SAMPLER_CUBE                              = 0x8DCC;
  const GLenum INT_SAMPLER_2D_ARRAY                          = 0x8DCF;
  const GLenum UNSIGNED_INT_SAMPLER_2D                       = 0x8DD2;
  const GLenum UNSIGNED_INT_SAMPLER_3D                       = 0x8DD3;
  const GLenum UNSIGNED_INT_SAMPLER_CUBE                     = 0x8DD4;
  const GLenum UNSIGNED_INT_SAMPLER_2D_ARRAY                 = 0x8DD7;
  const GLenum DEPTH_COMPONENT32F                            = 0x8CAC;
  const GLenum DEPTH32F_STENCIL8                             = 0x8CAD;
  const GLenum FLOAT_32_UNSIGNED_INT_24_8_REV                = 0x8DAD;
  const GLenum FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING         = 0x8210;
  const GLenum FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE         = 0x8211;
  const GLenum FRAMEBUFFER_ATTACHMENT_RED_SIZE               = 0x8212;
  const GLenum FRAMEBUFFER_ATTACHMENT_GREEN_SIZE             = 0x8213;
  const GLenum FRAMEBUFFER_ATTACHMENT_BLUE_SIZE              = 0x8214;
  const GLenum FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE             = 0x8215;
  const GLenum FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE             = 0x8216;
  const GLenum FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE           = 0x8217;
  const GLenum FRAMEBUFFER_DEFAULT                           = 0x8218;
  const GLenum UNSIGNED_INT_24_8                             = 0x84FA;
  const GLenum DEPTH24_STENCIL8                              = 0x88F0;
  const GLenum UNSIGNED_NORMALIZED                           = 0x8C17;
  const GLenum DRAW_FRAMEBUFFER_BINDING                      = 0x8CA6; /* Same as FRAMEBUFFER_BINDING */
  const GLenum READ_FRAMEBUFFER                              = 0x8CA8;
  const GLenum DRAW_FRAMEBUFFER                              = 0x8CA9;
  const GLenum READ_FRAMEBUFFER_BINDING                      = 0x8CAA;
  const GLenum RENDERBUFFER_SAMPLES                          = 0x8CAB;
  const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER          = 0x8CD4;
  const GLenum MAX_COLOR_ATTACHMENTS                         = 0x8CDF;
  const GLenum COLOR_ATTACHMENT1                             = 0x8CE1;
  const GLenum COLOR_ATTACHMENT2                             = 0x8CE2;
  const GLenum COLOR_ATTACHMENT3                             = 0x8CE3;
  const GLenum COLOR_ATTACHMENT4                             = 0x8CE4;
  const GLenum COLOR_ATTACHMENT5                             = 0x8CE5;
  const GLenum COLOR_ATTACHMENT6                             = 0x8CE6;
  const GLenum COLOR_ATTACHMENT7                             = 0x8CE7;
  const GLenum COLOR_ATTACHMENT8                             = 0x8CE8;
  const GLenum COLOR_ATTACHMENT9                             = 0x8CE9;
  const GLenum COLOR_ATTACHMENT10                            = 0x8CEA;
  const GLenum COLOR_ATTACHMENT11                            = 0x8CEB;
  const GLenum COLOR_ATTACHMENT12                            = 0x8CEC;
  const GLenum COLOR_ATTACHMENT13                            = 0x8CED;
  const GLenum COLOR_ATTACHMENT14                            = 0x8CEE;
  const GLenum COLOR_ATTACHMENT15                            = 0x8CEF;
  const GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE            = 0x8D56;
  const GLenum MAX_SAMPLES                                   = 0x8D57;
  const GLenum HALF_FLOAT                                    = 0x140B;
  const GLenum RG                                            = 0x8227;
  const GLenum RG_INTEGER                                    = 0x8228;
  const GLenum R8                                            = 0x8229;
  const GLenum RG8                                           = 0x822B;
  const GLenum R16F                                          = 0x822D;
  const GLenum R32F                                          = 0x822E;
  const GLenum RG16F                                         = 0x822F;
  const GLenum RG32F                                         = 0x8230;
  const GLenum R8I                                           = 0x8231;
  const GLenum R8UI                                          = 0x8232;
  const GLenum R16I                                          = 0x8233;
  const GLenum R16UI                                         = 0x8234;
  const GLenum R32I                                          = 0x8235;
  const GLenum R32UI                                         = 0x8236;
  const GLenum RG8I                                          = 0x8237;
  const GLenum RG8UI                                         = 0x8238;
  const GLenum RG16I                                         = 0x8239;
  const GLenum RG16UI                                        = 0x823A;
  const GLenum RG32I                                         = 0x823B;
  const GLenum RG32UI                                        = 0x823C;
  const GLenum VERTEX_ARRAY_BINDING                          = 0x85B5;
  const GLenum R8_SNORM                                      = 0x8F94;
  const GLenum RG8_SNORM                                     = 0x8F95;
  const GLenum RGB8_SNORM                                    = 0x8F96;
  const GLenum RGBA8_SNORM                                   = 0x8F97;
  const GLenum SIGNED_NORMALIZED                             = 0x8F9C;
  const GLenum COPY_READ_BUFFER                              = 0x8F36;
  const GLenum COPY_WRITE_BUFFER                             = 0x8F37;
  const GLenum COPY_READ_BUFFER_BINDING                      = 0x8F36; /* Same as COPY_READ_BUFFER */
  const GLenum COPY_WRITE_BUFFER_BINDING                     = 0x8F37; /* Same as COPY_WRITE_BUFFER */
  const GLenum UNIFORM_BUFFER                                = 0x8A11;
  const GLenum UNIFORM_BUFFER_BINDING                        = 0x8A28;
  const GLenum UNIFORM_BUFFER_START                          = 0x8A29;
  const GLenum UNIFORM_BUFFER_SIZE                           = 0x8A2A;
  const GLenum MAX_VERTEX_UNIFORM_BLOCKS                     = 0x8A2B;
  const GLenum MAX_FRAGMENT_UNIFORM_BLOCKS                   = 0x8A2D;
  const GLenum MAX_COMBINED_UNIFORM_BLOCKS                   = 0x8A2E;
  const GLenum MAX_UNIFORM_BUFFER_BINDINGS                   = 0x8A2F;
  const GLenum MAX_UNIFORM_BLOCK_SIZE                        = 0x8A30;
  const GLenum MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS        = 0x8A31;
  const GLenum MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS      = 0x8A33;
  const GLenum UNIFORM_BUFFER_OFFSET_ALIGNMENT               = 0x8A34;
  const GLenum ACTIVE_UNIFORM_BLOCKS                         = 0x8A36;
  const GLenum UNIFORM_TYPE                                  = 0x8A37;
  const GLenum UNIFORM_SIZE                                  = 0x8A38;
  const GLenum UNIFORM_BLOCK_INDEX                           = 0x8A3A;
  const GLenum UNIFORM_OFFSET                                = 0x8A3B;
  const GLenum UNIFORM_ARRAY_STRIDE                          = 0x8A3C;
  const GLenum UNIFORM_MATRIX_STRIDE                         = 0x8A3D;
  const GLenum UNIFORM_IS_ROW_MAJOR                          = 0x8A3E;
  const GLenum UNIFORM_BLOCK_BINDING                         = 0x8A3F;
  const GLenum UNIFORM_BLOCK_DATA_SIZE                       = 0x8A40;
  const GLenum UNIFORM_BLOCK_ACTIVE_UNIFORMS                 = 0x8A42;
  const GLenum UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES          = 0x8A43;
  const GLenum UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER     = 0x8A44;
  const GLenum UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER   = 0x8A46;
  const GLenum INVALID_INDEX                                 = 0xFFFFFFFF;
  const GLenum MAX_VERTEX_OUTPUT_COMPONENTS                  = 0x9122;
  const GLenum MAX_FRAGMENT_INPUT_COMPONENTS                 = 0x9125;
  const GLenum MAX_SERVER_WAIT_TIMEOUT                       = 0x9111;
  const GLenum OBJECT_TYPE                                   = 0x9112;
  const GLenum SYNC_CONDITION                                = 0x9113;
  const GLenum SYNC_STATUS                                   = 0x9114;
  const GLenum SYNC_FLAGS                                    = 0x9115;
  const GLenum SYNC_FENCE                                    = 0x9116;
  const GLenum SYNC_GPU_COMMANDS_COMPLETE                    = 0x9117;
  const GLenum UNSIGNALED                                    = 0x9118;
  const GLenum SIGNALED                                      = 0x9119;
  const GLenum ALREADY_SIGNALED                              = 0x911A;
  const GLenum TIMEOUT_EXPIRED                               = 0x911B;
  const GLenum CONDITION_SATISFIED                           = 0x911C;
  const GLenum WAIT_FAILED                                   = 0x911D;
  const GLenum SYNC_FLUSH_COMMANDS_BIT                       = 0x00000001;
  const GLenum VERTEX_ATTRIB_ARRAY_DIVISOR                   = 0x88FE;
  const GLenum ANY_SAMPLES_PASSED                            = 0x8C2F;
  const GLenum ANY_SAMPLES_PASSED_CONSERVATIVE               = 0x8D6A;
  const GLenum SAMPLER_BINDING                               = 0x8919;
  const GLenum RGB10_A2UI                                    = 0x906F;
  const GLenum INT_2_10_10_10_REV                            = 0x8D9F;
  const GLenum TRANSFORM_FEEDBACK                            = 0x8E22;
  const GLenum TRANSFORM_FEEDBACK_PAUSED                     = 0x8E23;
  const GLenum TRANSFORM_FEEDBACK_ACTIVE                     = 0x8E24;
  const GLenum TRANSFORM_FEEDBACK_BINDING                    = 0x8E25;
  const GLenum TEXTURE_IMMUTABLE_FORMAT                      = 0x912F;
  const GLenum MAX_ELEMENT_INDEX                             = 0x8D6B;
  const GLenum TEXTURE_IMMUTABLE_LEVELS                      = 0x82DF;

  const GLint64 TIMEOUT_IGNORED                              = -1;

  /* WebGL-specific enums */
  const GLenum MAX_CLIENT_WAIT_TIMEOUT_WEBGL                 = 0x9247;

  /* Buffer objects */
  undefined copyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset,
                              GLintptr writeOffset, GLsizeiptr size);
  // MapBufferRange, in particular its read-only and write-only modes,
  // can not be exposed safely to JavaScript. GetBufferSubData
  // replaces it for the purpose of fetching data back from the GPU.
  undefined getBufferSubData(GLenum target, GLintptr srcByteOffset, [AllowShared] ArrayBufferView dstBuffer,
                             optional unsigned long long dstOffset = 0, optional GLuint length = 0);

  /* Framebuffer objects */
  undefined blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0,
                            GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
  undefined framebufferTextureLayer(GLenum target, GLenum attachment, WebGLTexture? texture, GLint level,
                                    GLint layer);
  undefined invalidateFramebuffer(GLenum target, sequence<GLenum> attachments);
  undefined invalidateSubFramebuffer(GLenum target, sequence<GLenum> attachments,
                                     GLint x, GLint y, GLsizei width, GLsizei height);
  undefined readBuffer(GLenum src);

  /* Renderbuffer objects */
  any getInternalformatParameter(GLenum target, GLenum internalformat, GLenum pname);
  undefined renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat,
                                           GLsizei width, GLsizei height);

  /* Texture objects */
  undefined texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,
                         GLsizei height);
  undefined texStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,
                         GLsizei height, GLsizei depth);

  undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
                       GLsizei depth, GLint border, GLenum format, GLenum type, GLintptr pboOffset);
  undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
                       GLsizei depth, GLint border, GLenum format, GLenum type,
                       TexImageSource source); // May throw DOMException
  undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
                       GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData);
  undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
                       GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
                       unsigned long long srcOffset);

  undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
                          GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
                          GLintptr pboOffset);
  undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
                          GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
                          TexImageSource source); // May throw DOMException
  undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
                          GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
                          [AllowShared] ArrayBufferView? srcData, optional unsigned long long srcOffset = 0);

  undefined copyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
                              GLint x, GLint y, GLsizei width, GLsizei height);

  undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
                                 GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLintptr offset);
  undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
                                 GLsizei height, GLsizei depth, GLint border, [AllowShared] ArrayBufferView srcData,
                                 optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0);

  undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                                    GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
                                    GLenum format, GLsizei imageSize, GLintptr offset);
  undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                                    GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
                                    GLenum format, [AllowShared] ArrayBufferView srcData,
                                    optional unsigned long long srcOffset = 0,
                                    optional GLuint srcLengthOverride = 0);

  /* Programs and shaders */
  [WebGLHandlesContextLoss] GLint getFragDataLocation(WebGLProgram program, DOMString name);

  /* Uniforms */
  undefined uniform1ui(WebGLUniformLocation? location, GLuint v0);
  undefined uniform2ui(WebGLUniformLocation? location, GLuint v0, GLuint v1);
  undefined uniform3ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2);
  undefined uniform4ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);

  undefined uniform1uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniform2uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniform3uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniform4uiv(WebGLUniformLocation? location, Uint32List data, optional unsigned long long srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniformMatrix3x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix4x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);

  undefined uniformMatrix2x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix4x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);

  undefined uniformMatrix2x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix3x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);

  /* Vertex attribs */
  undefined vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
  undefined vertexAttribI4iv(GLuint index, Int32List values);
  undefined vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
  undefined vertexAttribI4uiv(GLuint index, Uint32List values);
  undefined vertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);

  /* Writing to the drawing buffer */
  undefined vertexAttribDivisor(GLuint index, GLuint divisor);
  undefined drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
  undefined drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei instanceCount);
  undefined drawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLintptr offset);

  /* Multiple Render Targets */
  undefined drawBuffers(sequence<GLenum> buffers);

  undefined clearBufferfv(GLenum buffer, GLint drawbuffer, Float32List values,
                          optional unsigned long long srcOffset = 0);
  undefined clearBufferiv(GLenum buffer, GLint drawbuffer, Int32List values,
                          optional unsigned long long srcOffset = 0);
  undefined clearBufferuiv(GLenum buffer, GLint drawbuffer, Uint32List values,
                           optional unsigned long long srcOffset = 0);

  undefined clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);

  /* Query Objects */
  WebGLQuery createQuery();
  undefined deleteQuery(WebGLQuery? query);
  [WebGLHandlesContextLoss] GLboolean isQuery(WebGLQuery? query);
  undefined beginQuery(GLenum target, WebGLQuery query);
  undefined endQuery(GLenum target);
  WebGLQuery? getQuery(GLenum target, GLenum pname);
  any getQueryParameter(WebGLQuery query, GLenum pname);

  /* Sampler Objects */
  WebGLSampler createSampler();
  undefined deleteSampler(WebGLSampler? sampler);
  [WebGLHandlesContextLoss] GLboolean isSampler(WebGLSampler? sampler);
  undefined bindSampler(GLuint unit, WebGLSampler? sampler);
  undefined samplerParameteri(WebGLSampler sampler, GLenum pname, GLint param);
  undefined samplerParameterf(WebGLSampler sampler, GLenum pname, GLfloat param);
  any getSamplerParameter(WebGLSampler sampler, GLenum pname);

  /* Sync objects */
  WebGLSync? fenceSync(GLenum condition, GLbitfield flags);
  [WebGLHandlesContextLoss] GLboolean isSync(WebGLSync? sync);
  undefined deleteSync(WebGLSync? sync);
  GLenum clientWaitSync(WebGLSync sync, GLbitfield flags, GLuint64 timeout);
  undefined waitSync(WebGLSync sync, GLbitfield flags, GLint64 timeout);
  any getSyncParameter(WebGLSync sync, GLenum pname);

  /* Transform Feedback */
  WebGLTransformFeedback createTransformFeedback();
  undefined deleteTransformFeedback(WebGLTransformFeedback? tf);
  [WebGLHandlesContextLoss] GLboolean isTransformFeedback(WebGLTransformFeedback? tf);
  undefined bindTransformFeedback(GLenum target, WebGLTransformFeedback? tf);
  undefined beginTransformFeedback(GLenum primitiveMode);
  undefined endTransformFeedback();
  undefined transformFeedbackVaryings(WebGLProgram program, sequence<DOMString> varyings, GLenum bufferMode);
  WebGLActiveInfo? getTransformFeedbackVarying(WebGLProgram program, GLuint index);
  undefined pauseTransformFeedback();
  undefined resumeTransformFeedback();

  /* Uniform Buffer Objects and Transform Feedback Buffers */
  undefined bindBufferBase(GLenum target, GLuint index, WebGLBuffer? buffer);
  undefined bindBufferRange(GLenum target, GLuint index, WebGLBuffer? buffer, GLintptr offset, GLsizeiptr size);
  any getIndexedParameter(GLenum target, GLuint index);
  sequence<GLuint>? getUniformIndices(WebGLProgram program, sequence<DOMString> uniformNames);
  any getActiveUniforms(WebGLProgram program, sequence<GLuint> uniformIndices, GLenum pname);
  GLuint getUniformBlockIndex(WebGLProgram program, DOMString uniformBlockName);
  any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname);
  DOMString? getActiveUniformBlockName(WebGLProgram program, GLuint uniformBlockIndex);
  undefined uniformBlockBinding(WebGLProgram program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);

  /* Vertex Array Objects */
  WebGLVertexArrayObject createVertexArray();
  undefined deleteVertexArray(WebGLVertexArrayObject? vertexArray);
  [WebGLHandlesContextLoss] GLboolean isVertexArray(WebGLVertexArrayObject? vertexArray);
  undefined bindVertexArray(WebGLVertexArrayObject? array);
};

interface mixin WebGL2RenderingContextOverloads
{
  // WebGL1:
  undefined bufferData(GLenum target, GLsizeiptr size, GLenum usage);
  undefined bufferData(GLenum target, AllowSharedBufferSource? srcData, GLenum usage);
  undefined bufferSubData(GLenum target, GLintptr dstByteOffset, AllowSharedBufferSource srcData);
  // WebGL2:
  undefined bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, unsigned long long srcOffset,
                       optional GLuint length = 0);
  undefined bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData,
                          unsigned long long srcOffset, optional GLuint length = 0);

  // WebGL1 legacy entrypoints:
  undefined texImage2D(GLenum target, GLint level, GLint internalformat,
                       GLsizei width, GLsizei height, GLint border, GLenum format,
                       GLenum type, [AllowShared] ArrayBufferView? pixels);
  undefined texImage2D(GLenum target, GLint level, GLint internalformat,
                       GLenum format, GLenum type, TexImageSource source); // May throw DOMException

  undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                          GLsizei width, GLsizei height,
                          GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
  undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                          GLenum format, GLenum type, TexImageSource source); // May throw DOMException

  // WebGL2 entrypoints:
  undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
                       GLint border, GLenum format, GLenum type, GLintptr pboOffset);
  undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
                       GLint border, GLenum format, GLenum type,
                       TexImageSource source); // May throw DOMException
  undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
                       GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
                       unsigned long long srcOffset);

  undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
                          GLsizei height, GLenum format, GLenum type, GLintptr pboOffset);
  undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
                          GLsizei height, GLenum format, GLenum type,
                          TexImageSource source); // May throw DOMException
  undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
                          GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
                          unsigned long long srcOffset);

  undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
                                 GLsizei height, GLint border, GLsizei imageSize, GLintptr offset);
  undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
                                 GLsizei height, GLint border, [AllowShared] ArrayBufferView srcData,
                                 optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0);

  undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                                    GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLintptr offset);
  undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                                    GLsizei width, GLsizei height, GLenum format,
                                    [AllowShared] ArrayBufferView srcData,
                                    optional unsigned long long srcOffset = 0,
                                    optional GLuint srcLengthOverride = 0);

  undefined uniform1fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);
  undefined uniform2fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);
  undefined uniform3fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);
  undefined uniform4fv(WebGLUniformLocation? location, Float32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);

  undefined uniform1iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);
  undefined uniform2iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);
  undefined uniform3iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);
  undefined uniform4iv(WebGLUniformLocation? location, Int32List data, optional unsigned long long srcOffset = 0,
                       optional GLuint srcLength = 0);

  undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                             optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                             optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                             optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0);

  /* Reading back pixels */
  // WebGL1:
  undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
                       [AllowShared] ArrayBufferView? dstData);
  // WebGL2:
  undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
                       GLintptr offset);
  undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
                       [AllowShared] ArrayBufferView dstData, unsigned long long dstOffset);
};

[Exposed=(Window,Worker)]
interface WebGL2RenderingContext
{
};
WebGL2RenderingContext includes WebGLRenderingContextBase;
WebGL2RenderingContext includes WebGL2RenderingContextBase;
WebGL2RenderingContext includes WebGL2RenderingContextOverloads;

더 많은 binding points

void bindBuffer(GLenum target, WebGLBuffer? buffer) (OpenGL ES 3.0.6 §2.10.1, man page)
주어진 WebGLBuffer 객체를 주어진 binding point(target)에 바인딩한다. target은 다음 표에 제시되어 있다:
target
ARRAY_BUFFER
COPY_READ_BUFFER
COPY_WRITE_BUFFER
ELEMENT_ARRAY_BUFFER
PIXEL_PACK_BUFFER
PIXEL_UNPACK_BUFFER
TRANSFORM_FEEDBACK_BUFFER
UNIFORM_BUFFER

target이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

아래의 Buffer Object Binding 제한 사항을 참조하라.
void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer) (OpenGL ES 3.0.6 §4.4.1, man page)
주어진 WebGLFramebuffer 객체를 주어진 binding point(target)에 바인딩한다. target은 다음 표에 제시되어 있다:
target
FRAMEBUFFER
READ_FRAMEBUFFER
DRAW_FRAMEBUFFER

target이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

void bindTexture(GLenum target, WebGLTexture? texture) (OpenGL ES 3.0.6 §3.8.1, man page)
주어진 WebGLTexture 객체를 주어진 binding point(target)에 바인딩한다. target은 다음 표에 제시되어 있다:
target
TEXTURE_2D
TEXTURE_3D
TEXTURE_2D_ARRAY
TEXTURE_CUBE_MAP

target이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

상태 설정 및 얻기

any getParameter(GLenum pname) (OpenGL ES 3.0.6 §6.1.1, glGet OpenGL ES 3.0 man page, glGetString OpenGL ES 3.0 man page)
전달된 pname에 대한 값을 반환한다. WebGL 1.0의 모든 pname/type 값을 지원하는 것에 더해, 다음 parameters가 지원된다:
pname 반환 타입
COPY_READ_BUFFER_BINDING WebGLBuffer?
COPY_WRITE_BUFFER_BINDING WebGLBuffer?
DRAW_BUFFERi GLenum
DRAW_FRAMEBUFFER_BINDING WebGLFramebuffer?
FRAGMENT_SHADER_DERIVATIVE_HINT GLenum
MAX_3D_TEXTURE_SIZE GLint
MAX_ARRAY_TEXTURE_LAYERS GLint
MAX_CLIENT_WAIT_TIMEOUT_WEBGL GLint64
MAX_COLOR_ATTACHMENTS GLint
MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS GLint64
MAX_COMBINED_UNIFORM_BLOCKS GLint
MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS GLint64
MAX_DRAW_BUFFERS GLint
MAX_ELEMENT_INDEX GLint64
MAX_ELEMENTS_INDICES GLint
MAX_ELEMENTS_VERTICES GLint
MAX_FRAGMENT_INPUT_COMPONENTS GLint
MAX_FRAGMENT_UNIFORM_BLOCKS GLint
MAX_FRAGMENT_UNIFORM_COMPONENTS GLint
MAX_PROGRAM_TEXEL_OFFSET GLint
MAX_SAMPLES GLint
MAX_SERVER_WAIT_TIMEOUT GLint64
MAX_TEXTURE_LOD_BIAS GLfloat
MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS GLint
MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS GLint
MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS GLint
MAX_UNIFORM_BLOCK_SIZE GLint64
MAX_UNIFORM_BUFFER_BINDINGS GLint
MAX_VARYING_COMPONENTS GLint
MAX_VERTEX_OUTPUT_COMPONENTS GLint
MAX_VERTEX_UNIFORM_BLOCKS GLint
MAX_VERTEX_UNIFORM_COMPONENTS GLint
MIN_PROGRAM_TEXEL_OFFSET GLint
PACK_ROW_LENGTH GLint
PACK_SKIP_PIXELS GLint
PACK_SKIP_ROWS GLint
PIXEL_PACK_BUFFER_BINDING WebGLBuffer?
PIXEL_UNPACK_BUFFER_BINDING WebGLBuffer?
RASTERIZER_DISCARD GLboolean
READ_BUFFER GLenum
READ_FRAMEBUFFER_BINDING WebGLFramebuffer?
SAMPLER_BINDING WebGLSampler?
TEXTURE_BINDING_2D_ARRAY WebGLTexture?
TEXTURE_BINDING_3D WebGLTexture?
TRANSFORM_FEEDBACK_ACTIVE GLboolean
TRANSFORM_FEEDBACK_BINDING WebGLTransformFeedback?
TRANSFORM_FEEDBACK_BUFFER_BINDING WebGLBuffer?
TRANSFORM_FEEDBACK_PAUSED GLboolean
UNIFORM_BUFFER_BINDING WebGLBuffer?
UNIFORM_BUFFER_OFFSET_ALIGNMENT GLint
UNPACK_IMAGE_HEIGHT GLint
UNPACK_ROW_LENGTH GLint
UNPACK_SKIP_IMAGES GLint
UNPACK_SKIP_PIXELS GLint
UNPACK_SKIP_ROWS GLint
VERTEX_ARRAY_BINDING WebGLVertexArrayObject?

sequences 또는 typed arrays를 반환하는 모든 쿼리는 매번 새 객체를 반환한다.

pname이 위 표에 없고 WebGL 1.0에서 지원하는 parameter names 중 하나도 아니면, INVALID_ENUM 오류를 생성하고 null을 반환한다.

다음 pname 인수들은 현재 WebGL 구현의 어떤 측면을 설명하는 문자열을 반환한다:

VERSION 다음 형식의 version 또는 release number를 반환한다 WebGL<space>2.0<optional><space><vendor-specific information></optional>.
SHADING_LANGUAGE_VERSION 다음 형식의 version 또는 release number를 반환한다 WebGL<space>GLSL<space>ES<space>3.00<optional><space><vendor-specific information></optional>.

RED_BITS, GREEN_BITS, BLUE_BITS, 및 ALPHA_BITS에 대해, draw framebuffer의 active color attachments가 동일한 formats를 갖지 않으면, INVALID_OPERATION 오류를 생성하고 0을 반환한다.

any getIndexedParameter(GLenum target, GLuint index) (OpenGL ES 3.0.6 §6.1.1, glGet OpenGL ES 3.0 man page)
전달된 target에 대한 indexed value를 반환한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
target 반환 타입
TRANSFORM_FEEDBACK_BUFFER_BINDING WebGLBuffer?
TRANSFORM_FEEDBACK_BUFFER_SIZE GLsizeiptr
TRANSFORM_FEEDBACK_BUFFER_START GLintptr
UNIFORM_BUFFER_BINDING WebGLBuffer?
UNIFORM_BUFFER_SIZE GLsizeiptr
UNIFORM_BUFFER_START GLintptr

target이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

index가 indexed state target의 유효 범위 밖이면 INVALID_VALUE 오류를 생성한다.

OpenGL 오류가 생성되면 null을 반환한다.

GLboolean isEnabled(GLenum cap) (OpenGL ES 3.0.6 §6.1.1, OpenGL ES 3.0 man page)
WebGL 1.0의 모든 cap 값에 더해, RASTERIZER_DISCARD가 지원된다.
void pixelStorei(GLenum pname, GLint param) (OpenGL ES 3.0.6 §3.7.1, OpenGL ES 3.0 man page)
WebGL 1.0의 parameters에 더해, WebGL 2.0 명세는 다음 추가 parameters를 허용한다:
pname
PACK_ROW_LENGTH
PACK_SKIP_PIXELS
PACK_SKIP_ROWS
UNPACK_ROW_LENGTH
UNPACK_IMAGE_HEIGHT
UNPACK_SKIP_PIXELS
UNPACK_SKIP_ROWS
UNPACK_SKIP_IMAGES

Buffer objects

void bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, unsigned long long srcOffset, optional GLuint length = 0); (OpenGL ES 3.0.6 §2.10.2, man page)
현재 바인딩된 WebGLBuffer 객체의 크기를 설정한 다음, srcData의 sub-region을 buffer 객체로 복사한다.

buftarget에 바인딩된 buffer라고 하자.

length가 0이면: 그렇지 않으면, copyLengthlength로 둔다.

srcDataDataView이면 buf의 크기를 copyLength로 설정한다. 그렇지 않으면 buf의 크기를 copyLength * srcData.BYTES_PER_ELEMENT로 설정한다.

srcDataDataView이면 elementSize를 1로 둔다. 그렇지 않으면 elementSizesrcData.BYTES_PER_ELEMENT로 둔다.

copyLength가 0보다 크면, srcData에서 bufcopyLength개의 typed elements(각각 크기 elementSize)를 복사하며, srcData는 element index srcOffset에서 시작해 읽는다. copyLength가 0이면 buf에 data가 쓰이지 않지만, 이는 GL 오류가 생성되게 하지 않는다. 오류가 생성되면 buf의 크기는 수정되지 않으며, 어떤 data도 쓰이지 않는다.
void bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData, unsigned long long srcOffset, optional GLuint length = 0); (OpenGL ES 3.0.6 §2.10.2, man page)
srcData의 sub-region을 현재 바인딩된 WebGLBuffer 객체로 복사한다.

buftarget에 바인딩된 buffer라고 하자.

length가 0이면: 그렇지 않으면, copyLengthlength로 둔다.

srcDataDataView이면 copyByteLengthcopyLength로 둔다. 그렇지 않으면 copyByteLengthcopyLength * srcData.BYTES_PER_ELEMENT로 둔다.

srcDataDataView이면 elementSize를 1로 둔다. 그렇지 않으면 elementSizesrcData.BYTES_PER_ELEMENT로 둔다.

copyLength가 0보다 크면, srcData에서 bufcopyLength개의 typed elements(각각 크기 elementSize)를 복사하며, srcData는 element index srcOffset에서 시작해 읽고, buf는 byte offset dstByteOffset에서 시작해 쓴다. copyLength가 0이면 buf에 data가 쓰이지 않지만, 이는 GL 오류가 생성되게 하지 않는다. 오류가 생성되면 어떤 data도 buf에 쓰이지 않는다.
any getBufferParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.9, man page)
전달된 pname에 대한 값을 반환한다. WebGL 1.0에서처럼 pname BUFFER_USAGE로 쿼리하는 것을 지원하는 것에 더해, pname BUFFER_SIZE로 쿼리하면 buffer size를 GLsizeiptr 타입의 값으로 반환한다.

void copyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) (OpenGL ES 3.0.6 §2.10.5, man page)

readTarget에 바인딩된 buffer의 data 일부를 writeTarget에 바인딩된 buffer로 복사한다. WebGL 2.0 API가 부과하는 제한 사항은 Copying Buffers를 보라.

undefined getBufferSubData(GLenum target, GLintptr srcByteOffset, [AllowShared] ArrayBufferView dstBuffer, optional unsigned long long dstOffset = 0, optional GLuint length = 0)

바인딩된 WebGLBuffer에서 dstBuffer로 data를 다시 읽는다.

buftarget에 바인딩된 buffer라고 하자.

length가 0이면: 그렇지 않으면, copyLengthlength로 둔다.

dstBufferDataView이면 copyByteLengthcopyLength로 둔다. 그렇지 않으면 copyByteLengthcopyLength * dstBuffer.BYTES_PER_ELEMENT로 둔다.

dstBufferDataView이면 elementSize를 1로 둔다. 그렇지 않으면 elementSizedstBuffer.BYTES_PER_ELEMENT로 둔다.

copyLength가 0보다 크면, buf에서 dstBuffercopyLength개의 typed elements(각각 크기 elementSize)를 복사하며, buf는 byte index srcByteOffset에서 시작해 읽고 dstBuffer에는 element index dstOffset에서 시작해 쓴다. copyLength가 0이면 dstBuffer에 data가 쓰이지 않지만, 이는 GL 오류가 생성되게 하지 않는다. 오류가 생성되면 어떤 data도 dstBuffer에 쓰이지 않는다.

buffer가 다른 operations와 getBufferSubData에 의해 순차적으로 쓰이고 읽히는 경우, data가 일관되게 접근되도록 보장하는 것은 WebGL API의 책임이다. 이는 buffer가 현재 transform feedback binding point에 바인딩되어 있는 경우에도 적용된다.

이는 blocking operation이다. WebGL은 결과를 반환하기 위해 source buffer에 대한 이전 모든 writes를 완전히 끝내야 하기 때문이다. multi-process WebGL 구현에서 getBufferSubData는 remote process에서 결과를 가져오기 위해 비용이 큰 inter-process round-trip도 발생시킬 수 있다.

사용자는 buffer에서 다시 읽을 의도를 알림으로써 이러한 비용을 피할 수 있다:

  • source buffer에 write한 뒤 fenceSync를 삽입하고, getBufferSubData operation을 수행하기 전에 그것이 통과하기를 기다린다.
  • readback source로 사용될 buffers는 _READ usage hint로 할당한다. (_READ usage hint로 할당된 buffers의 과도한 사용은 피하라. 이는 buffer data의 shadow copy를 유지하는 데 overhead를 발생시킬 수 있다.)

Framebuffer objects

[WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target) (OpenGL ES 3.0.6 §4.4.4.2, man page)

WebGL 1.0의 checkFramebufferStatus와의 차이점만 여기에 설명한다.

targetDRAW_FRAMEBUFFER, READ_FRAMEBUFFER 또는 FRAMEBUFFER여야 한다. FRAMEBUFFERDRAW_FRAMEBUFFER와 동등하다.

depth 및 stencil attachments가 존재하는 경우 같은 image가 아니면 FRAMEBUFFER_UNSUPPORTED를 반환한다. 자세한 논의는 Framebuffer Object Attachments를 보라.

attach된 renderbuffers 사이에서 RENDERBUFFER_SAMPLES 값이 다르거나, attach된 images가 renderbuffers와 textures의 혼합이고 그 값이 0이 아니면 FRAMEBUFFER_INCOMPLETE_MULTISAMPLE을 반환한다.

attach된 images의 width, height 및 depth(3D textures의 경우) 또는 array size (2D array textures의 경우)가 서로 다르면 FRAMEBUFFER_INCOMPLETE_DIMENSIONS를 반환한다. checkFramebufferStatus may return FRAMEBUFFER_INCOMPLETE_DIMENSIONS를 보라.

같은 image가 둘 이상의 color attachment point에 attach되어 있으면 FRAMEBUFFER_UNSUPPORTED를 반환한다. Framebuffer color attachments를 보라.

any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname) (OpenGL ES 3.0.6 §6.1.13, similar to glGetFramebufferAttachmentParameteriv)
전달된 target 및 attachment가 주어졌을 때 전달된 pname에 대한 값을 반환한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
pname 반환 타입
FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE GLint
FRAMEBUFFER_ATTACHMENT_BLUE_SIZE GLint
FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING GLenum
FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE GLenum
FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE GLint
FRAMEBUFFER_ATTACHMENT_GREEN_SIZE GLint
FRAMEBUFFER_ATTACHMENT_OBJECT_NAME WebGLRenderbuffer or WebGLTexture
FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE GLenum
FRAMEBUFFER_ATTACHMENT_RED_SIZE GLint
FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE GLint
FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE GLint
FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER GLint
FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL GLint

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

OpenGL 오류가 생성되면 null을 반환한다.

attachmentDEPTH_STENCIL_ATTACHMENT이고 서로 다른 images가 depth 및 stencil attachment points에 attach되어 있으면, INVALID_OPERATION 오류를 생성한다. 자세한 논의는 Framebuffer Object Attachments를 보라.

void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) (OpenGL ES 3.0.6 §4.3.3, man page)

[Read Operation]이면서 동시에 [Draw Operation]이다.
read framebuffer의 한 영역에서 draw framebuffer의 다른 영역으로 pixel values의 rectangle을 전송한다. read framebuffer의 SAMPLE_BUFFERS 값이 1이고 draw framebuffer의 SAMPLE_BUFFERS 값이 0이면, source의 각 pixel location에 해당하는 samples는 destination에 쓰이기 전에 single sample로 변환된다.

중심이 source buffer 밖의 point에 해당하는 모든 destination pixel은 그대로 유지된다.

WebGL context의 default back buffer의 color attachment로 blit할 때, alpha:false로 생성된 context는 internal format RGB8을 가진 것으로 간주되고, alpha:true로 생성된 context는 internal format RGBA8을 가진 것으로 간주된다.

이 함수가 complete framebuffer의 missing attachment로 blit하려고 하면, Drawing to a Missing Attachment에 따라 해당 attachment에는 아무것도 blitted되지 않고 오류도 생성되지 않는다.
이 함수가 complete framebuffer의 missing attachment에서 read하려고 하고, blit할 image가 있는 draw buffer가 하나 이상 있으면, Reading from a Missing Attachment에 따라 INVALID_OPERATION 오류가 생성된다.

void framebufferTextureLayer(GLenum target, GLenum attachment, WebGLTexture? texture, GLint level, GLint layer) (OpenGL ES 3.0.6 §4.4.2.4, man page)

texture가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

void invalidateFramebuffer(GLenum target, sequence<GLenum> attachments) (OpenGL ES 3.0.6 §4.5, man page)

[Draw Operation]이다.
xy를 0으로 설정하고 widthheight를 가장 큰 framebuffer object attachments의 width 및 height로 설정하여 invalidateSubFramebuffer를 호출하는 것과 동등하다.

void invalidateSubFramebuffer (GLenum target, sequence<GLenum> attachments, GLint x, GLint y, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.5, man page)

[Draw Operation]이다.
바인딩된 framebuffer object의 모든 내용을 보존할 필요가 없음을 GL에 signal한다.

void readBuffer(GLenum src) (OpenGL ES 3.0.6 §4.3.1, man page)

read framebuffer의 color buffer를 read buffer로 지정한다.

Renderbuffer objects

any getInternalformatParameter(GLenum target, GLenum internalformat, GLenum pname) (OpenGL ES 3.0.6 §6.1.15, man page)

전달된 target 및 internalformat이 주어졌을 때 전달된 pname에 대한 값을 반환한다. 반환되는 타입은 다음 표에 제시되어 있다:
pname 반환 타입
SAMPLES Int32Array

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

OpenGL 오류가 생성되면 null을 반환한다.

SAMPLES에 대한 각 쿼리는 새 typed array object instance를 반환한다.

any getRenderbufferParameter(GLenum target, GLenum pname) (OpenGL ES 2.0 §6.1.14, similar to glGetRenderbufferParameteriv)
전달된 target이 주어졌을 때 전달된 pname에 대한 값을 반환한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
pname 반환 타입
RENDERBUFFER_WIDTH GLint
RENDERBUFFER_HEIGHT GLint
RENDERBUFFER_INTERNAL_FORMAT GLenum
RENDERBUFFER_RED_SIZE GLint
RENDERBUFFER_GREEN_SIZE GLint
RENDERBUFFER_BLUE_SIZE GLint
RENDERBUFFER_ALPHA_SIZE GLint
RENDERBUFFER_DEPTH_SIZE GLint
RENDERBUFFER_SAMPLES GLint
RENDERBUFFER_STENCIL_SIZE GLint

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

OpenGL 오류가 생성되면 null을 반환한다.

void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.4.2.1, man page)

specificationman page에 자세히 설명된 OpenGL ES 3.0의 internal formats를 허용한다.

WebGL 1과 backward compatible하기 위해 internal format DEPTH_STENCIL도 허용하며, 구현은 이를 DEPTH24_STENCIL8로 mapping해야 한다.

void renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.4.2.1, man page)

`internalFormat == DEPTH_STENCIL && samples > 0`일 때 INVALID_OPERATION을 생성한다.

Texture objects

Texture objects는 texturing operations를 위한 storage와 state를 제공한다. WebGLTexture가 바인딩되어 있지 않으면(예: bindTexture에 null 또는 0을 전달), texture object를 수정하거나 쿼리하려는 시도는 INVALID_OPERATION 오류를 생성해야 한다. 이는 OpenGL ES 3.0 명세가 함수가 default texture를 변경하는 것을 허용하는 경우 아래 함수들에 표시되어 있다.

any getTexParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.3, man page)
전달된 target이 주어졌을 때 전달된 pname에 대한 값을 반환한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
pname 반환 타입
TEXTURE_BASE_LEVEL GLint
TEXTURE_COMPARE_FUNC GLenum
TEXTURE_COMPARE_MODE GLenum
TEXTURE_IMMUTABLE_FORMAT GLboolean
TEXTURE_IMMUTABLE_LEVELS GLuint
TEXTURE_MAG_FILTER GLenum
TEXTURE_MAX_LEVEL GLint
TEXTURE_MAX_LOD GLfloat
TEXTURE_MIN_FILTER GLenum
TEXTURE_MIN_LOD GLfloat
TEXTURE_WRAP_R GLenum
TEXTURE_WRAP_S GLenum
TEXTURE_WRAP_T GLenum

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

OpenGL 오류가 생성되면 null을 반환한다.

void texParameterf(GLenum target, GLenum pname, GLfloat param) (OpenGL ES 3.0.6 §3.8.7, man page)
전달된 target이 주어졌을 때 전달된 pname에 대한 값을 설정한다. pname은 다음 표에 제시되어 있다:
pname
TEXTURE_BASE_LEVEL
TEXTURE_COMPARE_FUNC
TEXTURE_COMPARE_MODE
TEXTURE_MAG_FILTER
TEXTURE_MAX_LEVEL
TEXTURE_MAX_LOD
TEXTURE_MIN_FILTER
TEXTURE_MIN_LOD
TEXTURE_WRAP_R
TEXTURE_WRAP_S
TEXTURE_WRAP_T

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

void texParameteri(GLenum target, GLenum pname, GLint param) (OpenGL ES 3.0.6 §3.8.7, man page)

전달된 target이 주어졌을 때 전달된 pname에 대한 값을 설정한다. pname은 위 표에 제시된 texParameterf의 것과 동일하다.

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

void texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §3.8.4, man page)

two-dimensional 또는 cube-map texture의 모든 levels를 동시에 지정한다.

image contents는 OpenGL ES 3.0 specification section 3.8.4의 pseudocode 안에서 각 texImage2D(또는 compressed formats의 경우 compressedTexImage2D) 호출에 0으로 초기화된 충분한 크기의 buffer가 전달된 것처럼 설정된다. (OpenGL ES 3.0.6 §3.8.4).
texStorage2DtexImage2D에 대한 선호되는 대안으로 간주되어야 한다. 일부 구현에서는 texImage2D보다 memory cost가 낮을 수 있다.

void texStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) (OpenGL ES 3.0.6 §3.8.4, man page)

three-dimensional texture 또는 two-dimensional array texture의 모든 levels를 지정한다.

image contents는 OpenGL ES 3.0 specification section 3.8.4의 pseudocode 안에서 각 texImage3D(또는 compressed formats의 경우 compressedTexImage3D) 호출에 0으로 초기화된 충분한 크기의 buffer가 전달된 것처럼 설정된다. (OpenGL ES 3.0.6 §3.8.4).
undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, unsigned long long srcOffset) (OpenGL ES 3.0.6 §3.8.3, man page)

WebGL 1.0의 texImage2D와의 차이점만 여기에 설명한다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

Sized internal formats는 WebGL 2.0에서 지원되며 internalformat은 더 이상 format과 같을 필요가 없다. 대신 internalformat, format, 및 type의 조합은 man page의 Table 1 또는 2에 나열되어 있어야 한다.

typeFLOAT_32_UNSIGNED_INT_24_8_REV로 지정되면, srcData는 null이어야 한다. 그렇지 않으면 INVALID_OPERATION 오류를 생성한다.

srcData의 타입은 다음 표에 따라 type과 일치해야 한다. 그렇지 않으면 INVALID_OPERATION 오류를 생성한다:

srcData의 타입 type
Int8Array BYTE
Uint8Array UNSIGNED_BYTE
Uint8ClampedArray UNSIGNED_BYTE
Int16Array SHORT
Uint16Array UNSIGNED_SHORT
Uint16Array UNSIGNED_SHORT_5_6_5
Uint16Array UNSIGNED_SHORT_5_5_5_1
Uint16Array UNSIGNED_SHORT_4_4_4_4
Int32Array INT
Uint32Array UNSIGNED_INT
Uint32Array UNSIGNED_INT_5_9_9_9_REV
Uint32Array UNSIGNED_INT_2_10_10_10_REV
Uint32Array UNSIGNED_INT_10F_11F_11F_REV
Uint32Array UNSIGNED_INT_24_8
Uint16Array HALF_FLOAT
Float32Array FLOAT

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset에서 시작하여 srcData에 충분한 data가 없으면 INVALID_OPERATION을 생성한다.

[throws] undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.3, man page)

WebGL 1.0의 texImage2D와의 차이점만 여기에 설명한다.

WebGL 2.0에서 도입된 새 formats로의 변환은 다음 표에 따라 수행된다.

Source DOM Image Format Target WebGL Format
RED RG
Grayscale (1 channel) R = sourceGray
R = sourceGray
G = 0
Grayscale + Alpha (2 channels) R = sourceGray
R = sourceGray
G = 0
Color (3 channels)
Color + Alpha (4 channels)
R = sourceRed
R = sourceRed
G = sourceGreen

elements의 subregions 업로드는 Pixel store parameters for uploads from TexImageSource에 자세히 설명되어 있다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

Sized internal formats는 WebGL 2.0에서 지원되며 internalformat은 더 이상 format과 같을 필요가 없다. 대신 internalformat, format, 및 type의 조합은 다음 표에 나열되어 있어야 한다:

Internal Format Format Type
RGB RGB UNSIGNED_BYTE
UNSIGNED_SHORT_5_6_5
RGBA RGBA UNSIGNED_BYTE,
UNSIGNED_SHORT_4_4_4_4
UNSIGNED_SHORT_5_5_5_1
LUMINANCE_ALPHA LUMINANCE_ALPHA UNSIGNED_BYTE
LUMINANCE LUMINANCE UNSIGNED_BYTE
ALPHA ALPHA UNSIGNED_BYTE
R8 RED UNSIGNED_BYTE
R16F RED HALF_FLOAT
FLOAT
R32F RED FLOAT
R8UI RED_INTEGER UNSIGNED_BYTE
RG8 RG UNSIGNED_BYTE
RG16F RG HALF_FLOAT
FLOAT
RG32F RG FLOAT
RG8UI RG_INTEGER UNSIGNED_BYTE
RGB8 RGB UNSIGNED_BYTE
SRGB8 RGB UNSIGNED_BYTE
RGB565 RGB UNSIGNED_BYTE
UNSIGNED_SHORT_5_6_5
R11F_G11F_B10F RGB UNSIGNED_INT_10F_11F_11F_REV
HALF_FLOAT
FLOAT
RGB9_E5 RGB HALF_FLOAT
FLOAT
RGB16F RGB HALF_FLOAT
FLOAT
RGB32F RGB FLOAT
RGB8UI RGB_INTEGER UNSIGNED_BYTE
RGBA8 RGBA UNSIGNED_BYTE
SRGB8_ALPHA8 RGBA UNSIGNED_BYTE
RGB5_A1 RGBA UNSIGNED_BYTE
UNSIGNED_SHORT_5_5_5_1
RGB10_A2 RGBA UNSIGNED_INT_2_10_10_10_REV
RGBA4 RGBA UNSIGNED_BYTE
UNSIGNED_SHORT_4_4_4_4
RGBA16F RGBA HALF_FLOAT
FLOAT
RGBA32F RGBA FLOAT
RGBA8UI RGBA_INTEGER UNSIGNED_BYTE
data source가 DOM element(HTMLImageElement, HTMLCanvasElement, 또는 HTMLVideoElement)이거나 ImageBitmap, ImageData, 또는 OffscreenCanvas 객체인 경우, 일반적으로 각 channel의 representation은 적어도 8 bits의 unsigned integer type이다. 그러한 representation을 signed integers 또는 더 많은 bits를 가진 unsigned integers로 변환하는 것은 명확히 정의되어 있지 않다. 예를 들어, RGBA8을 RGBA16UI로 변환할 때, 의도가 값을 16-bit unsigned integer의 전체 범위로 scale up하는 것인지 아닌지는 명확하지 않다. 따라서 최대 8 bits의 unsigned integer, half float, 또는 float로의 변환만 허용된다.
void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.3, man page)

PIXEL_UNPACK_BUFFER target에 바인딩된 WebGLBuffer에서 현재 바인딩된 WebGLTexture로 data를 업로드한다.

offset은 WebGLBuffer의 data store 안의 byte offset이다. 0보다 작으면 INVALID_VALUE를 생성한다.

format, type, 및 WebGLTexture의 internal format의 조합은 man page의 Table 1 또는 2에 나열되어 있어야 한다.

WebGLTexture가 바인딩되지 않은 상태에서 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

PIXEL_UNPACK_BUFFER target에 WebGLBuffer가 바인딩되어 있지 않으면 INVALID_OPERATION 오류를 생성한다.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, unsigned long long srcOffset) (OpenGL ES 3.0.6 §3.8.5, man page)

WebGL 1.0의 texSubImage2D와의 차이점만 여기에 설명한다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

format, type, 및 WebGLTexture의 internal format의 조합은 man page의 Table 1 또는 2에 나열되어 있어야 한다.

srcData의 타입은 위 표에 따라 type과 일치해야 한다. 그렇지 않으면 INVALID_OPERATION 오류를 생성한다.

이 함수의 동작에 영향을 주는 WebGL-specific pixel storage parameters는 Pixel Storage Parameters를 보라.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset에서 시작하여 srcData에 충분한 data가 없으면 INVALID_OPERATION을 생성한다.

undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.5, man page)

WebGL 1.0의 texSubImage2D와의 차이점만 여기에 설명한다.

elements의 subregions 업로드는 Pixel store parameters for uploads from TexImageSource에 자세히 설명되어 있다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

format, type, 및 WebGLTexture의 internal format의 조합은 이 표에 나열되어 있어야 한다.

undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.5, man page)

PIXEL_UNPACK_BUFFER target에 바인딩된 WebGLBuffer의 data로 현재 바인딩된 WebGLTexture의 sub-rectangle을 업데이트한다.

offset은 WebGLBuffer의 data store 안의 byte offset이다. 0보다 작으면 INVALID_VALUE 오류를 생성한다.

WebGLTexture가 바인딩되지 않은 상태에서 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

PIXEL_UNPACK_BUFFER target에 WebGLBuffer가 바인딩되어 있지 않으면 INVALID_OPERATION 오류를 생성한다.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData)

void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, unsigned long long srcOffset) (OpenGL ES 3.0.6 §3.8.3, man page)

three-dimensional 또는 two-dimensional array texture의 지정된 mipmap level을 할당하고 초기화한다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

srcData가 null이면, 0으로 초기화된 충분한 크기의 buffer가 전달된다.

internalformat, format, 및 type의 조합은 man page의 Table 1 또는 2에 나열되어 있어야 한다.

typeFLOAT_32_UNSIGNED_INT_24_8_REV로 지정되면, srcData는 null이어야 한다. 그렇지 않으면 INVALID_OPERATION 오류를 생성한다.

srcData가 non-null이면, srcData의 타입은 위 표에 따라 type과 일치해야 한다. 그렇지 않으면 INVALID_OPERATION 오류를 생성한다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

이 함수의 동작에 영향을 주는 WebGL-specific pixel storage parameters는 Pixel Storage Parameters를 보라.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset에서 시작하여 srcData에 충분한 data가 없으면 INVALID_OPERATION을 생성한다.

three-dimensional textures를 할당하려면 texImage3D 대신 texStorage3D를 사용하는 것이 권장된다. 일부 구현에서는 texImage3D가 texStorage3D에 비해 더 높은 memory cost를 부과할 수 있다.

undefined texImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.3, man page)

현재 바인딩된 WebGLTexture의 rectangular subregion을 업데이트한다.

elements의 subregions 업로드는 Pixel store parameters for uploads from TexImageSource에 자세히 설명되어 있다.

formattype 인수의 해석과 UNPACK_PREMULTIPLY_ALPHA_WEBGL pixel storage parameter에 대한 참고는 texImage2D를 보라.

ImageBitmap 이외의 인수 타입으로 이 함수가 호출될 때 그 동작에 영향을 주는 WebGL-specific pixel storage parameters는 Pixel Storage Parameters를 보라.

source에서 WebGL 구현으로 전송되는 첫 번째 pixel은 source의 왼쪽 위 모서리에 해당한다. 이 동작은 위에서 언급한 섹션에 설명된 대로 ImageBitmap 인수를 제외하고 UNPACK_FLIP_Y_WEBGL pixel storage parameter에 의해 수정된다.

format, type, 및 WebGLTexture의 internal format의 조합은 이 표에 나열되어 있어야 한다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

이 함수가 data 속성이 neutered된 ImageData와 함께 호출되면 INVALID_VALUE 오류가 생성된다.

이 함수가 neutered된 ImageBitmap과 함께 호출되면 INVALID_VALUE 오류가 생성된다.

이 함수가 포함하는 Document의 origin과 다른 origin을 가진 HTMLImageElement 또는 HTMLVideoElement와 함께 호출되거나, bitmap의 origin-clean flag가 false로 설정된 HTMLCanvasElement, ImageBitmap, 또는 OffscreenCanvas와 함께 호출되면, SECURITY_ERR 예외가 반드시 throw되어야 한다. Origin Restrictions를 보라.

void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.3, man page)

PIXEL_UNPACK_BUFFER target에 바인딩된 WebGLBuffer에서 현재 바인딩된 WebGLTexture로 data를 업로드한다.

offset은 WebGLBuffer의 data store 안의 byte offset이다. 0보다 작으면 INVALID_VALUE 오류를 생성한다.

WebGLTexture가 바인딩되지 않은 상태에서 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

PIXEL_UNPACK_BUFFER target에 WebGLBuffer가 바인딩되어 있지 않으면 INVALID_OPERATION 오류를 생성한다.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData, optional unsigned long long srcOffset = 0) (OpenGL ES 3.0.6 §3.8.5, man page)

현재 바인딩된 WebGLTexture의 rectangular subregion을 업데이트한다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

format, type, 및 WebGLTexture의 internal format의 조합은 man page의 Table 1 또는 2에 나열되어 있어야 한다.

typeFLOAT_32_UNSIGNED_INT_24_8_REV이면 INVALID_ENUM 오류를 생성한다.

srcData의 타입은 위 표에 따라 type과 일치해야 한다. 그렇지 않으면 INVALID_OPERATION 오류를 생성한다.

srcData가 non-null이지만 그 크기가 지정된 width, height, depth, format, type, 및 pixel storage parameters에 필요한 것보다 작으면 INVALID_OPERATION 오류를 생성한다.

이 함수의 동작에 영향을 주는 WebGL-specific pixel storage parameters는 Pixel Storage Parameters를 보라.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset에서 시작하여 srcData에 충분한 data가 없으면 INVALID_OPERATION을 생성한다.

undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.5, man page)

현재 바인딩된 WebGLTexture의 rectangular subregion을 업데이트한다.

elements의 subregions 업로드는 Pixel store parameters for uploads from TexImageSource에 자세히 설명되어 있다.

formattype 인수의 해석과 UNPACK_PREMULTIPLY_ALPHA_WEBGL pixel storage parameter에 대한 참고는 texImage2D를 보라.

ImageBitmap 이외의 인수 타입으로 이 함수가 호출될 때 그 동작에 영향을 주는 WebGL-specific pixel storage parameters는 Pixel Storage Parameters를 보라.

source에서 WebGL 구현으로 전송되는 첫 번째 pixel은 source의 왼쪽 위 모서리에 해당한다. 이 동작은 위에서 언급한 섹션에 설명된 대로 ImageBitmap 인수를 제외하고 UNPACK_FLIP_Y_WEBGL pixel storage parameter에 의해 수정된다.

format, type, 및 WebGLTexture의 internal format의 조합은 이 표에 나열되어 있어야 한다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

이 함수가 data 속성이 neutered된 ImageData와 함께 호출되면 INVALID_VALUE 오류가 생성된다.

이 함수가 neutered된 ImageBitmap과 함께 호출되면 INVALID_VALUE 오류가 생성된다.

이 함수가 포함하는 Document의 origin과 다른 origin을 가진 HTMLImageElement 또는 HTMLVideoElement와 함께 호출되거나, bitmap의 origin-clean flag가 false로 설정된 HTMLCanvasElement, ImageBitmap, 또는 OffscreenCanvas와 함께 호출되면, SECURITY_ERR 예외가 반드시 throw되어야 한다. Origin Restrictions를 보라.

void texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.5, man page)

PIXEL_UNPACK_BUFFER target에 바인딩된 WebGLBuffer의 data로 현재 바인딩된 WebGLTexture의 sub-rectangle을 업데이트한다.

offset은 WebGLBuffer의 data store 안의 byte offset이다. 0보다 작으면 INVALID_VALUE 오류를 생성한다.

WebGLTexture가 바인딩되지 않은 상태에서 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

PIXEL_UNPACK_BUFFER target에 WebGLBuffer가 바인딩되어 있지 않으면 INVALID_OPERATION 오류를 생성한다.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

void copyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §3.8.5, man page)

[Read Operation]이다.
WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류가 생성된다.

framebuffer 밖에 있는 모든 pixel에 대해, 대응하는 destination pixel은 그대로 유지된다. Reading Pixels Outside the Framebuffer를 보라.

이 함수가 complete framebuffer의 missing attachment에서 read하려고 하면, Reading from a Missing Attachment에 따라 INVALID_OPERATION 오류가 생성된다.

undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, [AllowShared] ArrayBufferView srcData, optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset > srcData.length이면 INVALID_VALUE 오류를 생성한다.

srcLengthOverride의 기본값은 srcData.length - srcOffset이다.

srcOffset에서 시작하여 srcData에 충분한 data가 없거나, 전달된 data의 양이 compressed image의 format, dimensions 및 contents와 일치하지 않으면 INVALID_VALUE 오류를 생성한다.

undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, [AllowShared] ArrayBufferView srcData, optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset > srcData.length이면 INVALID_VALUE 오류를 생성한다.

srcLengthOverride의 기본값은 srcData.length - srcOffset이다.

srcOffset에서 시작하여 srcData에 충분한 data가 없거나, 전달된 data의 양이 compressed image의 format, dimensions 및 contents와 일치하지 않으면 INVALID_VALUE 오류를 생성한다.

undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, [AllowShared] ArrayBufferView srcData, optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset > srcData.length이면 INVALID_VALUE 오류를 생성한다.

srcLengthOverride의 기본값은 srcData.length - srcOffset이다.

srcOffset에서 시작하여 srcData에 충분한 data가 없거나, 전달된 data의 양이 compressed image의 format, dimensions 및 contents와 일치하지 않으면 INVALID_VALUE 오류를 생성한다.

undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, [AllowShared] ArrayBufferView srcData, optional unsigned long long srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)

srcData에서 읽기는 srcData 안의 srcOffset elements 지점에서 시작된다. (Elements는 Uint8Array의 경우 bytes, Int32Array의 경우 int32s 등이다.)

srcOffset > srcData.length이면 INVALID_VALUE 오류를 생성한다.

srcLengthOverride의 기본값은 srcData.length - srcOffset이다.

srcOffset에서 시작하여 srcData에 충분한 data가 없거나, 전달된 data의 양이 compressed image의 format, dimensions 및 contents와 일치하지 않으면 INVALID_VALUE 오류를 생성한다.

이 섹션은 위 네 entry points에 적용된다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이러한 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

WebGLBuffer가 PIXEL_UNPACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

OpenGL ES 3.0에 정의된 ETC2 및 EAC texture formats는 WebGL 2.0에서 사용할 수 없다.

void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)

void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)

void compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)

void compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)

이 섹션은 위 네 entry points에 적용된다.

WebGLTexture가 바인딩되지 않은 상태(위 참조)에서 이러한 함수를 호출하려는 시도가 이루어지면 INVALID_OPERATION 오류를 생성한다.

PIXEL_UNPACK_BUFFER target에 WebGLBuffer가 바인딩되어 있지 않으면 INVALID_OPERATION 오류를 생성한다.

offset은 WebGLBuffer의 data store 안의 byte offset이다. 0보다 작으면 INVALID_VALUE 오류를 생성한다.

OpenGL ES 3.0에 정의된 ETC2 및 EAC texture formats는 WebGL 2.0에서 사용할 수 없다.

Programs 및 Shaders

[WebGLHandlesContextLoss] GLint getFragDataLocation(WebGLProgram program, DOMString name) (OpenGL ES 3.0.6 §3.9.2.3, man page)

program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성하고 -1을 반환한다.
any getProgramParameter(WebGLProgram? program, GLenum pname) (OpenGL ES 3.0.6 §6.1.12, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성하고 null을 반환한다.

전달된 program이 주어졌을 때 전달된 pname에 대한 값을 반환한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
pname 반환 타입
DELETE_STATUS GLboolean
LINK_STATUS GLboolean
VALIDATE_STATUS GLboolean
ATTACHED_SHADERS GLint
ACTIVE_ATTRIBUTES GLint
ACTIVE_UNIFORMS GLint
TRANSFORM_FEEDBACK_BUFFER_MODE GLenum
TRANSFORM_FEEDBACK_VARYINGS GLint
ACTIVE_UNIFORM_BLOCKS GLint

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성하고 null을 반환한다.

이 함수의 실행 중 OpenGL 오류가 생성되면 null을 반환한다.

Uniforms 및 attributes

any getUniform(WebGLProgram program, WebGLUniformLocation location) (OpenGL ES 3.0.6 §6.1.12, man page)
program 또는 location 중 하나가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면, INVALID_OPERATION 오류를 생성한다.

전달된 program 안에서 전달된 location의 uniform 값을 반환한다. 반환되는 타입은 uniform type에 따라 달라진다. WebGL 2.0의 새 uniform types에 대해 반환되는 타입은 다음 표에 제시되어 있다:
uniform type 반환 타입
uint GLuint
uvec2 Uint32Array (2 elements 포함)
uvec3 Uint32Array (3 elements 포함)
uvec4 Uint32Array (4 elements 포함)
mat2x3 Float32Array (6 elements 포함)
mat2x4 Float32Array (8 elements 포함)
mat3x2 Float32Array (6 elements 포함)
mat3x4 Float32Array (12 elements 포함)
mat4x2 Float32Array (8 elements 포함)
mat4x3 Float32Array (12 elements 포함)
any sampler type GLint

WebGL 1.0과 공유되는 uniform types에 대해 반환되는 타입은 WebGL 1.0과 동일하다.

void uniform[1234]ui(WebGLUniformLocation? location, ...)

void uniform[1234]uiv(WebGLUniformLocation? location, ...)

void uniformMatrix[234]x[234]fv(WebGLUniformLocation? location, ...) (OpenGL ES 3.0.6 §2.12.6, man page)

위의 각 uniform* 함수는 지정된 uniform 또는 uniforms를 제공된 값으로 설정한다. 전달된 location이 null이 아니고 현재 사용 중인 program에서 이전의 getUniformLocation 호출을 통해 얻어진 것이 아니라면, INVALID_OPERATION 오류가 생성된다. 전달된 location이 null이면, 전달된 data는 조용히 무시되고 어떤 uniform variables도 변경되지 않는다.

vector forms(v로 끝나는 것들) 중 어느 것에 전달된 array가 invalid length를 가지면, INVALID_VALUE 오류가 생성된다. length는 할당된 type에 비해 너무 짧거나 정수 배수가 아니면 invalid이다.

srcLength arg가 있는 overloads에서:

void vertexAttribI4[u]i(GLuint index, ...)

void vertexAttribI4[u]iv(GLuint index, ...) (OpenGL ES 3.0.6 §2.8, man page)

전달된 index의 vertex attribute를 주어진 constant integer value로 설정한다. vertexAttrib를 통해 설정된 값은 중간에 drawArrays 또는 drawElements 호출이 있었더라도, CURRENT_VERTEX_ATTRIB param과 함께 getVertexAttrib 함수에서 반환되는 것이 보장된다.

vector forms(v로 끝나는 것들) 중 어느 것에 전달된 array가 너무 짧으면, INVALID_VALUE 오류가 생성된다.

void vertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) (OpenGL ES 3.0.6 §2.9, man page)

현재 ARRAY_BUFFER target에 바인딩된 WebGLBuffer 객체를 전달된 index의 vertex attribute에 할당한다. 값은 항상 integer values로 남겨진다. Size는 attribute당 components의 수이다. Stride와 offset은 bytes 단위이다. 전달된 stride 및 offset은 전달된 type 및 size에 적합해야 하며, 그렇지 않으면 INVALID_OPERATION 오류가 생성된다. Buffer Offset and Stride Requirements를 보라. offset이 음수이면 INVALID_VALUE 오류가 생성된다. ARRAY_BUFFER target에 WebGLBuffer가 바인딩되어 있지 않고 offset이 0이 아니면, INVALID_OPERATION 오류가 생성된다. WebGL에서 지원되는 최대 stride는 255이다. Vertex Attribute Data Stride를 보라.
any getVertexAttrib(GLuint index, GLenum pname) (OpenGL ES 3.0.6 §6.1.12, man page)
전달된 index의 vertex attribute에 대해 pname에서 요청된 정보를 반환한다. 반환되는 타입은 요청된 정보에 따라 달라지며, 다음 표에 표시되어 있다:
pname 반환 타입
VERTEX_ATTRIB_ARRAY_BUFFER_BINDING WebGLBuffer
VERTEX_ATTRIB_ARRAY_ENABLED GLboolean
VERTEX_ATTRIB_ARRAY_SIZE GLint
VERTEX_ATTRIB_ARRAY_STRIDE GLint
VERTEX_ATTRIB_ARRAY_TYPE GLenum
VERTEX_ATTRIB_ARRAY_NORMALIZED GLboolean
CURRENT_VERTEX_ATTRIB Float32Array, Int32Array 또는 Uint32Array 중 하나 (각각 4 elements 포함)
VERTEX_ATTRIB_ARRAY_INTEGER GLboolean
VERTEX_ATTRIB_ARRAY_DIVISOR GLint

CURRENT_VERTEX_ATTRIB의 경우, 반환 타입은 주어진 index에 대해 가장 최근에 호출된 vertexAttrib 계열 함수에 의해 결정된다. 즉, vertexAttribI4i*가 사용되었다면 반환 타입은 Int32Array이고, vertexAttribI4ui*가 사용되었다면 반환 타입은 Uint32Array이며, 그렇지 않으면 Float32Array이다.

sequences 또는 typed arrays를 반환하는 모든 쿼리는 매번 새 객체를 반환한다.

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

OpenGL 오류가 생성되면 null을 반환한다.

drawing buffer에 쓰기

void clear(GLbitfield mask) (OpenGL ES 3.0.6 §4.2.3, man page)

buffers를 preset values로 clear한다. clear될 buffers 중 integer color buffer가 있으면, INVALID_OPERATION 오류가 생성되고 아무것도 clear되지 않는다.

void vertexAttribDivisor(GLuint index, GLuint divisor) (OpenGL ES 3.0.6 §2.9, man page)

index로 식별되는 vertex attribute가 drawing 중 advance하는 rate를 설정한다.

void drawArrays(GLenum mode, GLint first, GLsizei count) (OpenGL ES 3.0.6 §2.9.3, man page)

[Draw Operation]이다.

void drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §2.9.3, man page)

[Draw Operation]이다.

void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) (OpenGL ES 3.0.6 §2.9.3, man page)

[Draw Operation]이다.
현재 활성화된 vertex attributes를 사용하여 instanceCount개의 geometry instances를 그린다. non-zero divisor를 가진 vertex attributes는 divisor instances마다 한 번 advance한다.

void drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei instanceCount) (OpenGL ES 3.0.6 §2.9.3, man page)

[Draw Operation]이다.
현재 바인딩된 element array buffer를 사용하여 instanceCount개의 geometry instances를 그린다. non-zero divisor를 가진 vertex attributes는 divisor instances마다 한 번 advance한다.

void drawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §2.9.3, man page)

[Draw Operation]이다.
현재 바인딩된 element array buffer를 사용해 그린다. WebGL 1.0 명세의 Writing to the drawing buffer 섹션에서 drawElements에 대해 지정된 모든 error conditions가 적용된다.

또한 draw에 사용되는 indices가 [start, end] 범위 밖에 있다면, 구현은 Enabled Vertex Attributes and Range Checking에 정의된 동작을 보장하거나, 단순히 startend 인수를 버리고 대신 drawElements를 호출할 수 있다. 어느 경우에도 이 원인으로 GL 오류가 생성되어서는 안 된다.

drawElements, drawArrays, drawRangeElements 및 그 instanced variants 호출 중, WebGL 2.0은 OpenGL ES 3.0에 지정된 것 이상의 추가 error checking을 수행한다:

pixels 다시 읽기

현재 framebuffer의 pixels는 ArrayBufferView 객체 또는 PIXEL_PACK_BUFFER target에 바인딩된 WebGLBuffer로 다시 읽을 수 있다.

WebGL 1.0의 Reading back pixels와의 차이점만 여기에 설명한다.

undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView dstData, unsigned long long dstOffset) (OpenGL ES 3.0 §4.3.2, man page)
[Read Operation]이다.

WebGLBuffer가 PIXEL_PACK_BUFFER target에 바인딩되어 있으면 INVALID_OPERATION 오류를 생성한다.

pixel store parameter constraints가 충족되지 않으면 INVALID_OPERATION 오류를 생성한다.

dstDatadstOffset에서 시작하는 read operation을 위한 충분한 공간을 갖지 않으면 INVALID_OPERATION을 생성한다.

이는 blocking operation이다. WebGL은 결과를 반환하기 위해 source framebuffer에 대한 이전 모든 rendering operations를 완전히 끝내야 하기 때문이다. multi-process WebGL 구현에서는 remote process에서 결과를 가져오기 위해 비용이 큰 inter-process round-trip도 발생한다.

대신 PIXEL_PACK_BUFFERreadPixels를 사용하는 것을 고려하라. 해당 buffer에서 data를 읽으려면 getBufferSubData를 사용하라. (그 호출에서 blocking을 피하는 방법은 getBufferSubData를 보라.)

void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0 §4.3.2, man page)

PIXEL_PACK_BUFFER target에 WebGLBuffer가 바인딩되어 있지 않으면 INVALID_OPERATION 오류를 생성한다.

offset은 WebGLBuffer의 data store 안의 byte offset이다. 0보다 작으면 INVALID_VALUE 오류를 생성한다. pixel store modes를 고려했을 때 WebGLBuffer의 data store 나머지가 지정된 rectangle의 모든 pixels를 가져오기에 충분히 크지 않으면, INVALID_OPERATION을 생성한다.

Multiple render targets

void drawBuffers(sequence<GLenum> buffers) (OpenGL ES 3.0.6 §4.2.1, man page)

모든 fragment colors가 쓰이는 draw buffers를 정의한다.
이는 draw하지 않으며, 이후 호출을 위한 state만 설정한다.

void clearBufferfv(GLenum buffer, GLint drawbuffer, Float32List values, optional unsigned long long srcOffset = 0);

void clearBufferiv(GLenum buffer, GLint drawbuffer, Int32List values, optional unsigned long long srcOffset = 0);

void clearBufferuiv(GLenum buffer, GLint drawbuffer, Uint32List values, optional unsigned long long srcOffset = 0);

void clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); (OpenGL ES 3.0.6 §4.2.3, man page) 이들은 [Draw Operations]이다.

지정된 buffer의 모든 pixel을 constant value로 설정한다. color buffer에 사용해야 하는 clearBuffer 함수는 color buffer의 타입에 따라 달라지며, 다음 표에 제시되어 있다:
buffer의 타입 clearBuffer 함수
floating point clearBufferfv
fixed point clearBufferfv
signed integer clearBufferiv
unsigned integer clearBufferuiv

bufferCOLOR_BUFFER이고 함수가 위 표에 따라 선택되지 않으면, INVALID_OPERATION 오류가 생성되고 아무것도 clear되지 않는다.

ArrayBufferView entrypoints의 경우, srcOffset에서 시작하여 values에 충분한 elements가 없으면 INVALID_VALUE를 생성한다.

clearBufferfi는 depth 및 stencil buffers를 clear하는 데 사용할 수 있다. bufferDEPTH_STENCIL이어야 하고 drawBuffer는 zero여야 한다. depthstencil은 각각 depth 및 stencil 값이다.

이 함수가 complete framebuffer의 missing attachment를 clear하려고 하면, Drawing to a Missing Attachment에 따라 아무것도 clear되지 않고 오류도 생성되지 않는다.

Query objects

WebGLQuery createQuery() (OpenGL ES 3.0.6 §2.14, man page)

WebGLQuery 객체를 생성하고 glGenQueries를 호출한 것처럼 query object name으로 초기화한다.

void deleteQuery(WebGLQuery? query) (OpenGL ES 3.0.6 §2.14, man page)

query가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 WebGLQuery 안에 포함된 query object를 glDeleteQueries를 호출한 것처럼 deletion 대상으로 표시한다. 객체가 이미 deletion 대상으로 표시되어 있다면, 이 호출은 아무 효과가 없다. underlying GL object는 JS object가 destroyed될 때 자동으로 deletion 대상으로 표시되지만, 이 method는 authors가 객체를 일찍 deletion 대상으로 표시할 수 있게 한다는 점에 유의하라.

[WebGLHandlesContextLoss] GLboolean isQuery(WebGLQuery? query) (OpenGL ES 3.0.6 §6.1.7, man page)

전달된 WebGLQuery가 유효하면 true를 반환하고, 그렇지 않으면 false를 반환한다.

query가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 false를 반환한다.

query의 invalidated flag가 설정되어 있으면 false를 반환한다.

void beginQuery(GLenum target, WebGLQuery query) (OpenGL ES 3.0.6 §2.14, man page)

query가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

asynchronous query를 시작한다. Target은 수행할 query의 타입을 나타낸다.

void endQuery(GLenum target) (OpenGL ES 3.0.6 §2.14, man page)

target이 지정한 query type에 대해 추적할 commands의 sequence 끝을 표시한다. 최종 query result가 사용 가능해지면 query object는 이를 나타내도록 업데이트되고, getQueryParameter를 호출하여 result를 가져올 수 있다.

WebGLQuery? getQuery(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.7, man page)

query target target에 대한 정보를 반환한다. 이는 occlusion queries의 경우 ANY_SAMPLES_PASSED 또는 ANY_SAMPLES_PASSED_CONSERVATIVE 중 하나여야 하며, primitive queries의 경우 TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN이어야 한다. pname은 query object target parameter의 symbolic name을 지정한다. 현재 이는 CURRENT_QUERY여야 하며, target에 대해 현재 active인 query 또는 null을 반환한다.

target 또는 pname이 위 목록에 없으면, INVALID_ENUM 오류를 생성하고 null을 반환한다.

이 함수의 실행 중 OpenGL 오류가 생성되면 null을 반환한다.

any getQueryParameter(WebGLQuery query, GLenum pname) (OpenGL ES 3.0.6 §6.1.7, man page)

query가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

query object의 parameter pname을 반환한다. QUERY_RESULT는 query object의 passed samples counter 값을 반환한다. QUERY_RESULT_AVAILABLE은 samples counter가 즉시 사용 가능한지 여부를 반환한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:

pname 반환 타입
QUERY_RESULT GLuint
QUERY_RESULT_AVAILABLE GLboolean

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성하고 null을 반환한다.

query가 유효한 query object가 아니거나, 현재 active query object이면, INVALID_OPERATION 오류를 생성하고 null을 반환한다.

이 함수의 실행 중 OpenGL 오류가 생성되면 null을 반환한다.

platforms 전반에 걸친 일관된 동작을 보장하기 위해, queries의 results는 user agent의 event loop가 task를 실행 중이 아닐 때만 사용 가능하게 되어야 한다. 다시 말해:

query의 result는 control이 user agent의 event loop로 돌아왔을 때 사용 가능할 수도 있고 아닐 수도 있다. delay가 0인 단일 setTimeout callback 또는 단일 requestAnimationFrame callback을 사용한다고 해서 WebGL 구현이 query의 results를 제공하기에 충분한 시간이 허용된다는 보장은 없다.
OpenGL ES 3.0 specification과 비교한 이 변경은 애플리케이션이 query를 발행하고 그 result를 같은 frame에서 가져올 수 있다고 의존하는 것을 방지하기 위해 강제된다. devices 간 최고의 portability 및 implementations 간 최고의 performance를 보장하기 위해, 애플리케이션은 queries의 results가 asynchronously 사용 가능해질 것을 예상해야 한다.

Sampler objects

WebGLSampler createSampler() (OpenGL ES 3.0.6 §3.8.2, man page)

WebGLSampler 객체를 생성하고, glGenSamplers를 호출한 것처럼 sampler object name으로 초기화한다.

void deleteSampler(WebGLSampler? sampler) (OpenGL ES 3.0.6 §3.8.2, man page)

sampler가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 WebGLSampler 안에 포함된 sampler object를, glDeleteSamplers를 호출한 것처럼 deletion 대상으로 표시한다. 객체가 이미 deletion 대상으로 표시되어 있다면, 이 호출은 아무 효과가 없다. underlying GL object는 JS object가 destroyed될 때 자동으로 deletion 대상으로 표시되지만, 이 method는 authors가 객체를 일찍 deletion 대상으로 표시할 수 있게 한다는 점에 유의하라.

[WebGLHandlesContextLoss] GLboolean isSampler(WebGLSampler? sampler) (OpenGL ES 3.0.6 §6.1.5, man page)

전달된 WebGLSampler가 유효하면 true를 반환하고, 그렇지 않으면 false를 반환한다.

sampler가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 false를 반환한다.

sampler의 invalidated flag가 설정되어 있으면 false를 반환한다.

void bindSampler(GLuint unit, WebGLSampler? sampler) (OpenGL ES 3.0.6 §3.8.2, man page)

sampler가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 WebGLSampler 안에 포함된 sampler object를 전달된 index의 texture unit에 바인딩한다. sampler가 texture unit에 바인딩되어 있으면, sampler의 state가 해당 texture unit에 바인딩된 texture의 sampling state를 대체한다. sampler가 null이면, 현재 바인딩된 sampler가 texture unit에서 언바인딩된다. 하나의 sampler object는 동시에 여러 texture units에 바인딩될 수 있다.

unitMAX_COMBINED_TEXTURE_IMAGE_UNITS 값보다 크거나 같으면, INVALID_VALUE 오류를 생성한다.

deletion 대상으로 표시된 객체를 바인딩하려는 시도는 INVALID_OPERATION 오류를 생성하며, 현재 binding은 그대로 유지된다.

void samplerParameteri(WebGLSampler sampler, GLenum pname, GLint param)

void samplerParameterf(WebGLSampler sampler, GLenum pname, GLfloat param)

(OpenGL ES 3.0.6 §3.8.2, man page)

sampler가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 sampler가 주어졌을 때 전달된 pname에 대한 값을 설정한다. pname은 다음 표에 제시되어 있다:
pname
TEXTURE_COMPARE_FUNC
TEXTURE_COMPARE_MODE
TEXTURE_MAG_FILTER
TEXTURE_MAX_LOD
TEXTURE_MIN_FILTER
TEXTURE_MIN_LOD
TEXTURE_WRAP_R
TEXTURE_WRAP_S
TEXTURE_WRAP_T

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

sampler가 유효한 sampler object가 아니면 INVALID_OPERATION 오류를 생성한다.

any getSamplerParameter(WebGLSampler sampler, GLenum pname) (OpenGL ES 3.0.6 §6.1.5, man page)
sampler가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

sampler로 전달된 주어진 WebGLSampler에 대해 pname에서 요청된 정보를 반환한다. 반환되는 타입은 요청된 정보에 따라 달라지며, 다음 표에 표시되어 있다:
pname 반환 타입
TEXTURE_COMPARE_FUNC GLenum
TEXTURE_COMPARE_MODE GLenum
TEXTURE_MAG_FILTER GLenum
TEXTURE_MAX_LOD GLfloat
TEXTURE_MIN_FILTER GLenum
TEXTURE_MIN_LOD GLfloat
TEXTURE_WRAP_R GLenum
TEXTURE_WRAP_S GLenum
TEXTURE_WRAP_T GLenum

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

sampler가 유효한 sampler object가 아니면 INVALID_OPERATION 오류를 생성한다.

이 함수의 실행 중 OpenGL 오류가 생성되면 null을 반환한다.

Sync objects

Sync objects는 GL server와 client 사이의 실행을 동기화하는 데 사용할 수 있다.

WebGLSync? fenceSync(GLenum condition, GLbitfield flags) (OpenGL ES 3.0.6 §5.2, man page)

새 fence sync object를 생성하고 GL command stream에 연관된 fence command를 삽입한다.

[WebGLHandlesContextLoss] GLboolean isSync(WebGLSync? sync) (OpenGL ES 3.0.6 §6.1.8, man page)

전달된 WebGLSync가 유효하면 true를 반환하고, 그렇지 않으면 false를 반환한다.

sync가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 false를 반환한다.

sync의 invalidated flag가 설정되어 있으면 false를 반환한다.

void deleteSync(WebGLSync? sync) (OpenGL ES 3.0.6 §5.2, man page)

sync가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 WebGLSync 안에 포함된 sync object를 glDeleteSync를 호출한 것처럼 deletion 대상으로 표시한다. 객체가 이미 deletion 대상으로 표시되어 있다면, 이 호출은 아무 효과가 없다. underlying GL object는 JS object가 destroyed될 때 자동으로 deletion 대상으로 표시되지만, 이 method는 authors가 객체를 일찍 deletion 대상으로 표시할 수 있게 한다는 점에 유의하라.

GLenum clientWaitSync(WebGLSync sync, GLbitfield flags, GLuint64 timeout) (OpenGL ES 3.0.6 §5.2.1, man page)

sync가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 sync object가 signaled되거나 지정된 timeout이 경과할 때까지 실행을 block한다. timeout의 단위는 nanoseconds이다.

네 가지 status values 중 하나를 반환한다. 반환값 ALREADY_SIGNALEDclientWaitSync가 호출된 시점에 sync가 signaled되었음을 나타낸다. ALREADY_SIGNALEDsync가 signaled되었다면 timeout이 zero였더라도 항상 반환된다. 반환값 TIMEOUT_EXPIREDsync가 signaled되기 전에 지정된 timeout period가 만료되었음을 나타낸다. 반환값 CONDITION_SATISFIED는 timeout이 만료되기 전에 sync가 signaled되었음을 나타낸다. 마지막으로 오류가 발생하면, 아래에 지정된 대로 오류를 생성하는 것에 더해, block하지 않고 WAIT_FAILED를 반환한다.

flags는 command flushing 동작을 제어하며 SYNC_FLUSH_COMMANDS_BIT를 포함할 수 있다. flags에 다른 bit가 설정되어 있으면 INVALID_OPERATION 오류가 생성된다. flagsSYNC_FLUSH_COMMANDS_BIT가 설정되어 있고 clientWaitSync가 호출될 때 sync가 unsignaled 상태이면, sync에서 block하기 전에 flush와 동등한 작업이 수행된다.

differences section에서 논의한 대로, WebGL 구현은 main thread가 오랜 시간 block되는 것을 방지하기 위해 짧은 maximum timeout을 부과해야 한다. implementation-defined timeout은 MAX_CLIENT_WAIT_TIMEOUT_WEBGL 인수로 getParameter를 호출하여 쿼리할 수 있다. timeout이 이 implementation-defined timeout보다 크면 INVALID_OPERATION 오류가 생성된다.

implementation-defined maximum timeout은 지정되어 있지 않다. 애플리케이션이 오랜 시간 기다려 interactivity를 저해하지 않도록 충분히 낮게 설정되어야 한다. 구현이 zero maximum timeout을 부과하는 것도 허용된다. WebGL 애플리케이션은 clientWaitSync를 사용해 오랜 시간 실행을 block해서는 안 된다.

이 함수의 실행 중 OpenGL 오류가 생성되면 WAIT_FAILED를 반환한다.

platforms 전반에 걸친 일관된 동작을 보장하기 위해, sync objects는 user agent의 event loop가 task를 실행 중이 아닐 때만 signaled state로 transition할 수 있다. 다시 말해:

void waitSync(WebGLSync sync, GLbitfield flags, GLint64 timeout) (OpenGL ES 3.0.6 §5.2.1, man page)

sync가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

즉시 반환하지만, 전달된 sync object가 signaled되거나 implementation-dependent timeout이 경과할 때까지 GL server에서 기다린다. 전달된 timeout은 반드시 TIMEOUT_IGNORED로 설정되어야 한다.
여러 GL contexts 사이의 동기화 가능성이 없는 경우, waitSync 호출은 실질적으로 no-op이다.
any getSyncParameter(WebGLSync sync, GLenum pname) (OpenGL ES 3.0.6 §6.1.8, man page)
sync가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 WebGLSync object가 주어졌을 때 전달된 pname에 대한 값을 반환한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
pname 반환 타입
OBJECT_TYPE GLenum
SYNC_STATUS GLenum
SYNC_CONDITION GLenum
SYNC_FLAGS GLbitfield

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성하고 null을 반환한다.

이 함수의 실행 중 OpenGL 오류가 생성되면 null을 반환한다.

platforms 전반에 걸친 일관된 동작을 보장하기 위해, sync objects는 user agent의 event loop가 task를 실행 중이 아닐 때만 signaled state로 transition할 수 있다. 다시 말해:

Transform feedback

Transform feedback mode는 vertex shader가 쓴 output variables의 값을 capture한다. vertices는 flatshading 및 clipping 전에 capture된다. 변환된 vertices는 하나 이상의 buffer objects에 저장된 뒤 선택적으로 discarded될 수도 있고, 추가 처리를 위해 clipping stage로 전달될 수도 있다. capture되는 output variables의 집합은 program이 linked될 때 결정된다.

default Transform Feedback object가 있으며, 이는 null WebGLTransformFeedback handle로 표현된다. context의 initial state에서 default object가 바인딩되어 있다. 바인딩되어 있을 때 getParameter(TRANSFORM_FEEDBACK_BINDING)null을 반환한다.

output variable이 transform feedback buffer object로 streamed되도록 지정되었지만 vertex shader가 실제로 쓰지 않았다면, 그 값은 0으로 설정된다. Transform feedback primitive capture를 보라.

WebGLTransformFeedback createTransformFeedback() (OpenGL ES 3.0.6 §2.15.1, similar to glGenTransformFeedbacks)
WebGLTransformFeedback 객체를 생성하고, glGenTransformFeedbacks를 호출한 것처럼 transform feedback object name으로 초기화한다.
void deleteTransformFeedback(WebGLTransformFeedback? transformFeedback) (OpenGL ES 3.0.6 §2.15.1, similar to glDeleteTransformFeedbacks)
transformFeedback가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 WebGLTransformFeedback 안에 포함된 transform feedback object를 glDeleteTransformFeedbacks를 호출한 것처럼 deletion 대상으로 표시한다. 객체가 이미 deletion 대상으로 표시되어 있다면, 이 호출은 아무 효과가 없다. underlying GL object는 JS object가 destroyed될 때 자동으로 deletion 대상으로 표시되지만, 이 method는 authors가 객체를 일찍 deletion 대상으로 표시할 수 있게 한다는 점에 유의하라.
[WebGLHandlesContextLoss] GLboolean isTransformFeedback(WebGLTransformFeedback? transformFeedback) (OpenGL ES 3.0.6 §6.1.11, man page)
전달된 WebGLTransformFeedback이 유효하면 true를 반환하고, 그렇지 않으면 false를 반환한다.

transform feedback이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 false를 반환한다.

transform feedback의 invalidated flag가 설정되어 있으면 false를 반환한다.
void bindTransformFeedback(GLenum target, WebGLTransformFeedback? transformFeedback) (OpenGL ES 3.0.6 §2.15.1, man page)
transformFeedback가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

주어진 WebGLTransformFeedback 객체를 바인딩한다. transformFeedback이 null이면, context가 제공하는 default transform feedback object가 바인딩된다. deletion 대상으로 표시된 객체를 바인딩하려는 시도는 INVALID_OPERATION 오류를 생성하며, 현재 binding은 그대로 유지된다.
void beginTransformFeedback(GLenum primitiveMode) (OpenGL ES 3.0.6 §2.15.2, man page)
void endTransformFeedback() (OpenGL ES 3.0.6 §2.15.2, man page)
void pauseTransformFeedback() (OpenGL ES 3.0.6 §2.15.2, man page)
void resumeTransformFeedback() (OpenGL ES 3.0.6 §2.15.2, man page)
void transformFeedbackVaryings(WebGLProgram program, sequence<DOMString> varyings, GLenum bufferMode) (OpenGL ES 3.0.6 §2.12.8, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

WebGLActiveInfo? getTransformFeedbackVarying(WebGLProgram program, GLuint index) (OpenGL ES 3.0.6 §2.12.8, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성하고 null을 반환한다.

Uniform Buffer objects

Uniform buffer objects는 named uniform blocks를 위한 storage를 제공하므로, named uniform blocks 안의 active uniforms 값은 buffer object의 내용을 수정하여 변경될 수 있다.

void bindBufferBase(GLenum target, GLuint index, WebGLBuffer? buffer) (OpenGL ES 3.0.6 §2.10.1.1, man page)
buffer가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

주어진 WebGLBuffer 객체를 target이 지정한 targets 배열의 index에 있는 binding point에 바인딩한다.
void bindBufferRange(GLenum target, GLuint index, WebGLBuffer? buffer, GLintptr offset, GLsizeiptr size) (OpenGL ES 3.0.6 §2.10.1.1, man page)
buffer가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

offsetsize로 표현되는 WebGLBuffer object buffer의 range를 target이 지정한 targets 배열의 index에 있는 binding point에 바인딩한다.
sequence<GLuint>? getUniformIndices(WebGLProgram program, sequence<DOMString> uniformNames) (OpenGL ES 3.0.6 §2.12.6, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

program 안의 여러 uniforms의 indices를 가져온다.

이 함수의 실행 중 OpenGL 오류가 생성되면 null을 반환한다.
any getActiveUniforms(WebGLProgram program, sequence<GLuint> uniformIndices, GLenum pname) (OpenGL ES 3.0.6 §2.12.6, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

uniformIndices 배열에 지정된 indices를 가진 program 안의 각 uniforms에 대해 pname이라는 parameter의 값을 쿼리한다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
pname 반환 타입
UNIFORM_TYPE sequence<GLenum>
UNIFORM_SIZE sequence<GLuint>
UNIFORM_BLOCK_INDEX sequence<GLint>
UNIFORM_OFFSET sequence<GLint>
UNIFORM_ARRAY_STRIDE sequence<GLint>
UNIFORM_MATRIX_STRIDE sequence<GLint>
UNIFORM_IS_ROW_MAJOR sequence<GLboolean>

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

이 함수의 실행 중 OpenGL 오류가 생성되면 null을 반환한다.

GLuint getUniformBlockIndex(WebGLProgram program, DOMString uniformBlockName) (OpenGL ES 3.0.6 §2.12.6, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

program 안의 uniform block index를 가져온다.
any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname) (OpenGL ES 3.0.6 §2.12.6, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

program 안의 active uniform block에 대한 정보를 가져온다. 반환되는 타입은 요청된 pname에 대한 자연스러운 타입이며, 다음 표에 제시되어 있다:
pname 반환 타입
UNIFORM_BLOCK_BINDING GLuint
UNIFORM_BLOCK_DATA_SIZE GLuint
UNIFORM_BLOCK_ACTIVE_UNIFORMS GLuint
UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES Uint32Array
UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER GLboolean
UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER GLboolean

pname이 위 표에 없으면 INVALID_ENUM 오류를 생성한다.

uniformBlockIndexprogram의 active block uniform이 아니거나 ACTIVE_UNIFORM_BLOCKS 값보다 크거나 같으면 INVALID_VALUE 오류를 생성한다.

OpenGL 오류가 생성되면 null을 반환한다.

DOMString? getActiveUniformBlockName(WebGLProgram program, GLuint uniformBlockIndex) (OpenGL ES 3.0.6 §2.12.6, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

program 안에서 uniformBlockIndex의 active uniform block name을 가져온다.
void uniformBlockBinding(WebGLProgram program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) (OpenGL ES 3.0.6 §2.12.6.5, man page)
program이 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

active uniform blocks에 binding points를 할당한다.

Vertex Array objects

Vertex Array objects(VAOs라고도 함)는 vertex processor가 사용하는 data의 정의와 관련된 모든 state를 캡슐화한다.

default Vertex Array object가 있으며, 이는 null WebGLVertexArrayObject handle로 표현된다. context의 initial state에서 default object가 바인딩되어 있다. 바인딩되어 있을 때 getParameter(VERTEX_ARRAY_BINDING)null을 반환한다.

void bindVertexArray(WebGLVertexArrayObject? vertexArray) (OpenGL ES 3.0.6 §2.11, man page)
vertexArray가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

주어진 WebGLVertexArrayObject 객체를 바인딩한다. vertexArray가 null이면, context가 제공하는 default vertex array가 바인딩된다. deleted vertex array를 바인딩하려는 시도는 INVALID_OPERATION 오류를 생성하며, 현재 binding은 그대로 유지된다.
WebGLVertexArrayObject createVertexArray() (OpenGL ES 3.0.6 §2.11, similar to glGenVertexArrays)
WebGLVertexArrayObject 객체를 생성하고, glGenVertexArrays를 호출한 것처럼 vertex array object name으로 초기화한다.
void deleteVertexArray(WebGLVertexArrayObject? vertexArray) (OpenGL ES 3.0.6 §2.11, similar to glDeleteVertexArrays)
vertexArray가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 INVALID_OPERATION 오류를 생성한다.

전달된 WebGLVertexArrayObject 안에 포함된 vertex array object를 glDeleteVertexArrays를 호출한 것처럼 deletion 대상으로 표시한다. 객체가 이미 deletion 대상으로 표시되어 있다면, 이 호출은 아무 효과가 없다. underlying GL object는 JS object가 destroyed될 때 자동으로 deletion 대상으로 표시되지만, 이 method는 authors가 객체를 일찍 deletion 대상으로 표시할 수 있게 한다는 점에 유의하라.
[WebGLHandlesContextLoss] GLboolean isVertexArray(WebGLVertexArrayObject? vertexArray) (OpenGL ES 3.0.6 §6.1.10, man page)
전달된 WebGLVertexArrayObject가 유효하면 true를 반환하고, 그렇지 않으면 false를 반환한다.

vertex array가 이 컨텍스트와 다른 WebGL2RenderingContext에 의해 생성되었다면 false를 반환한다.

vertex array의 invalidated flag가 설정되어 있으면 false를 반환한다.

WebGL 2.0과 WebGL 1.0의 기타 차이점

WebGL 2.0에 맞춰 업데이트 필요

하위 호환성 문제

오류

WebGL 2.0 API는 WebGL 1.0 API가 오류를 생성하는 경우와 다르게 동작할 수 있다. 오류를 생성하는 WebGL 1.0 API용 코드는 WebGL 2.0과 forward-compatible하다고 보장되지 않는다.

Extensions

WebGL 1.0 API에서 지원되었을 수 있는 일부 extensions는 WebGL 2.0 API에서 제거되었다. 자세한 내용은 WebGL Extension Registry를 보라.

Extensions는 보통 동등한 기능이 core specification 또는 개선된 extension 형태로 WebGL 2.0 API에서 이용 가능할 때만 제거된다. WebGL 1.0 extensions를 사용하는 애플리케이션이 WebGL 2.0 API에서 실행되도록 수정될 때, 승격된 각 extension에 대해 단순히 해당하는 WebGL 2.0 API functions로 호출을 redirect하는 dummy extension object를 만드는 것이 종종 가능하다. 애플리케이션이 shader language extensions를 사용한다면, shader를 GLSL ES 3.00으로 porting하는 것이 보통 필요하다.

Non-Power-of-Two Texture Access

Texture access는 WebGL 2.0 API에서 OpenGL ES 3.0 API와 같이 동작한다. 다시 말해, WebGL 1.0 API와 달리 non power of 2 textures에 대한 특별한 제한이 없다. 모든 mipmapping 및 모든 wrapping modes가 non-power-of-two images에 대해 지원된다.

Primitive Restart is Always Enabled

PRIMITIVE_RESTART_FIXED_INDEX is always enabled 섹션을 보라.

Framebuffer Object Attachments

WebGL 1.0에서 DEPTH_STENCIL_ATTACHMENTDEPTH_ATTACHMENTSTENCIL_ATTACHMENT 이외의 대체 attachment point이다. 그러나 WebGL 2.0에서는 DEPTH_STENCIL_ATTACHMENTDEPTH_ATTACHMENT + STENCIL_ATTACHMENT의 alias로 간주된다. 즉, 같은 image가 DEPTH_ATTACHMENTSTENCIL_ATTACHMENT 양쪽에 attach되어, 두 attachment points에 원래 attach되어 있던 images를 덮어쓴다.

다음과 같은 동작 sequence를 고려하라:

  1. renderbuffer 1을 DEPTH_ATTACHMENT에 attach한다;
  2. renderbuffer 2를 DEPTH_STENCIL_ATTACHMENT에 attach한다;
  3. nullDEPTH_STENCIL_ATTACHMENT에 attach한다.
WebGL 1.0에서는 framebuffer가 최종적으로 renderbuffer 1을 DEPTH_ATTACHMENT에 attach하고 STENCIL_ATTACHMENT에는 image가 attach되지 않은 상태가 된다. 그러나 WebGL 2.0에서는 DEPTH_ATTACHMENTSTENCIL_ATTACHMENT도 image가 attach되지 않는다.

Framebuffer Object Attachments에 정의된 constraints는 더 이상 WebGL 2.0에 적용되지 않는다.

서로 다른 images가 depth 및 stencil attachment points에 bind되어 있으면, checkFramebufferStatusFRAMEBUFFER_UNSUPPORTED를 반환하고, attachmentDEPTH_STENCIL_ATTACHMENTgetFramebufferAttachmentParameterINVALID_OPERATION 오류를 생성한다.

Texture Type in TexSubImage2D Calls

WebGL 1.0 API에서 texSubImage2D에 전달되는 type 인수는 texture object를 원래 정의할 때 사용된 type(즉, texImage2D 사용 시)과 일치해야 한다. WebGL 2.0 API에서는 이 제한이 해제되었다.

copyTexSubImage2D 및 readPixels 호출에서의 out-of-bounds 동작

WebGL 1.0의 Reading Pixels Outside the Framebuffer에서는, copyTexSubImage2DreadPixels가 out-of-bound pixels에 대해 대응하는 destination range를 건드리지 않아야 한다.

WebGL 2.0에서 PACK_BUFFER 객체가 bind되어 있고 PACK_ROW_LENGTH가 0이 아니며 width보다 작거나, 또는 UNPACK_BUFFER 객체가 bind되어 있고 UNPACK_ROW_LENGTH가 0이 아니며 width보다 작거나 UNPACK_IMAGE_HEIGHT가 0이 아니며 height보다 작으면, row/image를 packing/unpacking할 때 다음 row/image까지 확장될 수 있다. 해당 부분이 out-of-bounds이면 값은 그에 따라 변경될 수 있다.

copyTex{Sub}Image2D에서의 색상 변환

WebGL 1.0(OpenGL ES 2.0)에서는 internalformat의 component sizes가 source buffer의 internal format의 대응하는 component sizes보다 작은 것이 허용된다. 그러나 WebGL 2.0(OpenGL ES 3.0)에서는 internalformat이 sized이면, 그 component sizes가 source buffer의 effective internal format의 대응하는 component sizes와 정확히 일치해야 한다.

WebGL 1.0과 2.0 모두에서 source buffer components는 internalformat으로 변환되는 동안 drop될 수 있지만, 새 components는 추가될 수 없다.

FRAMEBUFFER_ATTACHMENT_OBJECT_NAME을 사용한 getFramebufferAttachmentParameter

getFramebufferAttachmentParameterpname FRAMEBUFFER_ATTACHMENT_OBJECT_NAME과 함께 호출되고 attachment에 attach된 image가 없으면, WebGL 1.0 / ES 2.0에서는 INVALID_OPERATION을 생성하지만, WebGL 2.0 / ES 3.0에서는 오류를 생성하지 않고 null이 반환된다.

WebGL 2.0 API에서 지원되는 새 기능

GLSL ES 3.00 지원

The OpenGL ES Shading Language, Version 1.00을 지원하는 것에 더해, WebGL 2.0 API는 몇 가지 제한과 함께 The OpenGL ES Shading Language, Version 3.00 [GLES30GLSL]으로 작성된 shaders도 허용한다.

WebGL 1.0 API와 마찬가지로, "webgl_" 및 "_webgl_"로 시작하는 identifiers는 WebGL이 사용하도록 reserved되어 있다. 이러한 prefixes로 시작하는 function, variable, structure name 또는 structure field를 선언하는 shader는 load가 허용되어서는 안 된다.

Maximum GLSL Token Size

WebGL 1.0은 길이가 최대 256 characters인 tokens를 지원한다. WebGL 2.0은 The OpenGL ES Shading Language, Version 3.00 (OpenGL ES 3.0.6 §1.5.1) 을 따르며, ESSL 1 및 ESSL 3 shaders 모두에 대해 길이가 최대 1024 characters인 tokens를 허용한다. 1024 characters보다 긴 tokens를 포함하는 shaders는 compile에 실패해야 한다.

Maximum Uniform and Attribute Location Lengths

WebGL 2.0은 uniform 및 attribute locations의 길이에 1024 characters 제한을 부과한다.

Vertex Attribute Divisor

WebGL 2.0 API에서 non-zero divisor를 가진 vertex attributes는 drawArraysdrawElements 호출 중 advance하지 않는다. (OpenGL ES 3.0.6 §2.9.3)

WebGL과 OpenGL ES 3.0의 차이점

이 섹션은 다양한 operating systems 및 devices 전반의 portability를 개선하기 위해 OpenGL ES 3.0 API에 비해 WebGL API에 적용된 변경 사항을 설명한다.

Buffer Object Binding

WebGL buffer type 이 type을 설정하는 binding points
undefined none
element array ELEMENT_ARRAY_BUFFER
other data ELEMENT_ARRAY_BUFFER, COPY_READ_BUFFER 및 COPY_WRITE_BUFFER를 제외한 모든 binding points

WebGL 2.0 API에서 buffers는 처음에 WebGL buffer type이 undefined로 설정된다. target 인수가 COPY_READ_BUFFER 또는 COPY_WRITE_BUFFER를 제외한 임의의 buffer binding point로 설정된 상태에서 bindBuffer, bindBufferRange 또는 bindBufferBase를 호출하면, bind되는 buffer의 WebGL buffer type이 위 표에 따라 설정된다. type이 undefined인 buffer를 COPY_READ_BUFFER 또는 COPY_WRITE_BUFFER binding points에 bind하면 그 type은 other data로 설정된다.

삭제된 buffer를 bind하려는 이러한 함수 중 하나에 대한 호출은 INVALID_OPERATION 오류를 생성하고, binding은 그대로 유지된다.

element array WebGL buffer type을 가진 WebGLBuffer를 other data에 속하는 binding point에 bind하려 하거나, other data WebGL buffer type을 가진 WebGLBuffer를 ELEMENT_ARRAY_BUFFER에 bind하려는 이러한 함수 중 하나에 대한 호출은 INVALID_OPERATION 오류를 생성하고, binding point의 state는 그대로 유지된다.

이 제한은 주어진 buffer object가 indices 또는 other data 중 하나만 포함할 수 있으며 둘 다 포함할 수는 없음을 의미한다.

이러한 제한은 WebGL 1.0 specification의 buffer object binding restrictions와 유사하다.

이 제한은 GPU에서 index buffers에 쓰는 것을 방지하기 위해 추가되었다. 그렇게 되면 index data에 대한 CPU-side checks 수행 비용이 지나치게 커지기 때문이다. index buffers를 다른 buffer data와 다르게 처리하는 것은 Direct3D API에도 더 잘 매핑된다.

Copying Buffers

Buffer Object Binding 섹션에 지정된 것처럼 element arrayother data WebGL buffer types를 가진 buffers 사이에서 copyBufferSubData를 사용해 복사하려고 하면 INVALID_OPERATION 오류가 생성되고 복사는 수행되지 않는다.

위의 Buffer Object Binding 제한과 동일하다.

Transform Feedback으로 undefined behavior 방지

현재 bind된 transform feedback object 안의 indexed TRANSFORM_FEEDBACK_BUFFER binding point와 WebGL API의 다른 binding point에 동시에 bind되어 있는 buffer는, generic TRANSFORM_FEEDBACK_BUFFER binding point를 제외하고, 사용할 수 없다. 이러한 double bound buffer를 사용하려는 모든 시도는 transform feedback이 enabled인지 여부와 관계없이 INVALID_OPERATION 오류로 실패한다. 예를 들어, buffer가 current transform feedback object에도 bind되어 있으면 PIXEL_PACK_BUFFER로의 readPixels는 실패한다.

오류가 생성되지 않으면 읽거나 쓰는 값은 undefined가 된다. ( OpenGL ES 3.0.6 §2.15.2)

같은 buffer가 active transform feedback 안에서 둘 이상의 indexed binding point에 bind되어 있는 경우, beginTransformFeedbackINVALID_OPERATION 오류를 생성한다.

이는 SEPARATE_ATTRIBS mode에서만 발생할 수 있다.
이는 D3D11의 제한으로, 두 different streams를 같은 buffer에 쓰는 것이 허용되지 않는다.

Draw Buffers

MAX_COLOR_ATTACHMENTS parameter의 값은 MAX_DRAW_BUFFERS parameter의 값과 같아야 한다.

이러한 parameters가 서로 달라야 할 use case는 없다.

ESSL1 fragment shader가 gl_FragColorgl_FragData 어느 쪽에도 쓰지 않으면, shader execution 이후 fragment colors의 값은 그대로 유지된다. ESSL3 fragment shader에서 대응하는 output variables가 정의되어 있지 않으면, shader execution 이후 fragment colors의 값은 그대로 유지된다.

모든 user-defined output variables는 shader execution 중 쓰이지 않으면 기본값이 zero가 된다.

최적의 performance를 위해 output array는 접근되지 않는 elements를 포함하지 않아야 한다.

draw buffer는 다음 경우 fragment shader와 "shader-output-incompatible"이다:

draw buffers 중 하나라도 "shader-output-incompatible"이면, draws는 다음 경우 INVALID_OPERATION을 생성한다:

No Program Binaries

compiled shader programs의 binary representations에 접근하는 것은 WebGL 2.0 API에서 지원되지 않는다. 여기에는 OpenGL ES 3.0 GetProgramBinary, ProgramBinary, 및 ProgramParameteri entry points가 포함된다. 또한 getProgramParameter로 program binary length를 query하는 것과, getParameter로 program binary formats를 query하는 것은 WebGL 2.0 API에서 지원되지 않는다.

Range Checking

WebGL 1.0 specification 섹션 Enabled Vertex Attributes and Range Checking에 지정된 range checking에 더해, drawElements, drawRangeElements 또는 drawElementsInstanced가 참조하는 indices가 MAX_ELEMENT_INDEX parameter보다 크면, bound buffer의 storage 안에 있더라도 draw call은 INVALID_OPERATION 오류를 생성한다. primitive restart가 enabled인 경우 primitive restart를 trigger하는 indices에는 range checking이 수행되지 않는다. WebGL 1.0 API에서 drawArrays에 대해 지정된 range checking은 WebGL 2.0 API의 drawArraysInstanced에도 적용된다.

OpenGL robustness extensions는 MAX_ELEMENT_INDEX보다 큰 indices가 사용될 때 무슨 일이 일어나는지 지정하지 않으므로, 이를 driver에 전달하는 것은 위험하다. MAX_ELEMENT_INDEX가 최대 unsigned integer 값과 같은 platforms에서는 이 섹션이 효과를 갖지 않는다.

Active Uniform Block Backing

WebGL 2.0 API에서 drawArrays, drawElements, drawRangeElements 또는 그 instanced variants로 draw하려는 시도는, draw command에 사용되는 program 안의 active uniform block 중 하나라도 충분히 큰 buffer object로 backed되어 있지 않으면 INVALID_OPERATION 오류를 생성한다.

OpenGL에서는 insufficient uniform block backing이 GL interruption 또는 termination을 일으키는 것이 허용된다. OpenGL ES 3.0 specification section 2.12.6 ( OpenGL ES 3.0.6 §2.12.6), "Uniform Buffer Object Bindings" 아래를 보라.

Default Framebuffer

WebGL에는 항상 default framebuffer가 있다. FRAMEBUFFER_UNDEFINED enumerant는 WebGL 2.0 API에서 제거되었다.

String Length Queries

WebGL 2.0 API에서 enumerants ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, UNIFORM_BLOCK_NAME_LENGTH, 및 UNIFORM_NAME_LENGTH는 유사하게 WebGL 1.0 API에서 제거된 enumerants에 더해 제거되었다.

Invalid Clears

WebGL 2.0 API에서 지정된 clear value의 type과 clear되는 buffer의 type 사이에 mismatch가 있을 때 clear를 수행하려고 하면 undefined results를 생성하는 대신 INVALID_OPERATION 오류가 생성된다.

Invalid Texture Offsets

GLSL shader가 texture lookup function arguments에서 implementation-defined parameters MIN_PROGRAM_TEXEL_OFFSETMAX_PROGRAM_TEXEL_OFFSET가 지정한 범위 밖의 texture offset value를 사용하려고 하면, WebGL 2.0 API에서 compilation에 실패해야 한다.

유효 범위 밖의 offset을 사용하면 undefined results가 반환되므로 허용될 수 없다. offset은 GLSL ES spec에 따라 constant expression이어야 하므로, 값을 올바른 범위와 대조하는 것은 compile time에 수행할 수 있다.

Texel Fetches

OpenGL ES 3.0 API에서 undefined results를 가지는 texel fetches는 WebGL 2.0 API에서 zero를 반환해야 하며, incomplete texture에서 texel fetch하는 경우에는 texture source color (0, 0, 0, 1)를 반환해야 한다.

out-of-range texel fetches의 동작은 security를 보장하기 위해 testable해야 한다.

GLSL ES 1.00 Fragment Shader Output

The OpenGL ES Shading Language, Version 1.00으로 작성된 fragment shader가 n이 constant value 0과 같지 않은 gl_FragData[n]에 정적으로 값을 할당하면, WebGL 2.0 API에서 compile에 실패해야 한다. 이는 The OpenGL ES 3.0 specification section 4.2.1 (OpenGL ES 3.0.6 §4.2.1) 및 The OpenGL ES Shading Language 3.00.6 specification section 1.5 (GLSL ES 3.00.6 §1.5)와의 consistency를 달성하기 위한 것이다. OpenGL ES 3.0 API에서처럼, WebGL 2.0 API에서는 GLSL ES 3.00 shaders에 대해서만 multiple fragment shader outputs가 지원된다.

No MapBufferRange

MapBufferRange, FlushMappedBufferRange, 및 UnmapBuffer entry points는 WebGL 2.0 API에서 제거되었다. 다음 enum values도 제거되었다: BUFFER_ACCESS_FLAGS, BUFFER_MAP_LENGTH, BUFFER_MAP_OFFSET, MAP_READ_BIT, MAP_WRITE_BIT, MAP_INVALIDATE_RANGE_BIT, MAP_INVALIDATE_BUFFER_BIT, MAP_FLUSH_EXPLICIT_BIT, 및 MAP_UNSYNCHRONIZED_BIT.

MapBufferRange를 사용하는 대신, buffer data는 getBufferSubData entry point를 사용하여 읽을 수 있다.

TIMEOUT_IGNORED

WebGL 2.0 API에서 TIMEOUT_IGNORED는 값이 0xFFFFFFFFFFFFFFFFGLuint64가 아니라 값이 -1GLint64로 정의된다. 이는 Javascript가 그만큼 큰 integer를 정확히 표현할 수 없기 때문이다. 같은 이유로 waitSync는 timeout에 대해 GLuint64 대신 GLint64 값을 받는다.

clientWaitSync

WebGL 2.0 API에서 WebGL 구현은 main thread의 실행이 과도하게 긴 시간 동안 block되는 것을 피하기 위해 clientWaitSync 호출에 대해 짧은 maximum timeout을 강제해야 한다. 이 timeout은 MAX_CLIENT_WAIT_TIMEOUT_WEBGL 인수로 getParameter를 호출하여 query할 수 있다.

implementation-defined maximum timeout은 지정되어 있지 않다. 구현이 zero maximum timeout을 강제하는 것은 허용된다.

Vertex Attribute Aliasing

WebGL 2.0 API 구현은 모든 vertex attribute aliasing이 허용되지 않음을 지정하는 GLSL ES 3.00.6 section 12.46을 엄격히 따라야 한다. [GLES30] p57에 명시된 것처럼, GLSL ES 1.00 shaders는 WebGL 1.0 spec 섹션 Attribute aliasing에서 허용한 대로 여전히 alias할 수 있다.

PRIMITIVE_RESTART_FIXED_INDEX is always enabled

OpenGL ES 3.0에서 Enable/Disable로 제어되는 PRIMITIVE_RESTART_FIXED_INDEX context state는 WebGL 2.0에서 지원되지 않는다. 대신, WebGL 2.0은 이 state가 항상 enabled된 것처럼 동작한다. 이는 WebGL 1.0과 비교한 compatibility difference이다.

drawElements, drawElementsInstanced, 또는 drawRangeElements가 index를 처리할 때, index의 값이 해당 data type의 최대값 ( UNSIGNED_BYTE indices의 경우 255, UNSIGNED_SHORT의 경우 65535, 또는 UNSIGNED_INT의 경우 4294967295)이면, vertex는 일반적으로 처리되지 않는다. 대신, drawing command가 바로 앞의 vertex로 끝나고, 동일한 parameters로 또 다른 drawing command가 즉시 시작되어 원래 지정된 indices의 바로 다음 index부터 끝까지 전송하는 것처럼 동작한다.

이 compatibility difference는 Direct3D 기반 WebGL implementations에서 performance pitfalls를 피하기 위해 도입되었다. primitive restart behavior가 원하지 않는 경우, applications 및 content creation tools는 maximum vertex index를 사용하지 않도록 조정할 수 있다.

No texture swizzles

OpenGL ES 3.0은 texture에 대해 four-channel swizzle operation을 지정할 수 있게 하는 texture objects의 새 state를 도입한다. swizzle은 해당 texture를 참조하는 shader 안에서 수행되는 모든 texture lookup에 적용된다. 이러한 texture swizzles는 WebGL 2.0에서 지원되지 않는다. TEXTURE_SWIZZLE_* enum values는 WebGL 2.0 API에서 제거되었다.

Texture swizzles는 Direct3D 기반 WebGL implementations에서 performant한 방식으로 구현될 수 없다. 이 기능에 의존하는 applications는 그러한 implementations에서 상당히 느리게 실행될 것이다. Applications는 이 interface 없이도 shaders에서 texture fetches의 결과를 swizzle하고, 업로드 전에 texture data를 swizzle할 수 있다.

link에 실패한 program에 대한 queries는 실패해야 한다

OpenGL ES 3.0은 지정된 program이 link에 실패했더라도 applications가 그 program의 active variables 및 interface blocks의 properties를 enumerate하고 query하는 것을 허용한다 (OpenGL ES 3.0.6 §2.12.3). WebGL에서는 이러한 commands가 link에 실패한 program에서 항상 INVALID_OPERATION 오류를 생성하며, 어떤 정보도 반환되지 않는다.

OpenGL ES 3.0에서 반환되는 정보는 implementation dependent이며 incomplete할 수 있다. error condition은 모든 platforms에서 일관된 동작을 보장하기 위해 추가되었다.

Fragment shader의 color values는 color buffer format과 일치해야 한다

fragment shader가 쓰는 color values는 floating-point, signed integer 또는 unsigned integer일 수 있다. fragment shader가 쓰는 값이 대응하는 color buffer(s)의 format(s)와 일치하지 않으면, OpenGL ES 3.0에서는 결과가 undefined이다 (OpenGL ES 3.0.6 §3.9.2.3). WebGL에서는 대응하는 draw call에서 drawArrays, drawElements, drawArraysInstanced , drawElementsInstanced , 및 drawRangeElements를 포함하여 INVALID_OPERATION 오류를 생성한다.

color buffer가 normalized fixed-point format을 가지면, floating-point color values는 format에 맞게 변환된다. 이러한 상황에서는 오류가 생성되지 않는다.

Sampler type은 internal texture format과 일치해야 한다

Texture lookup functions는 lookup function에 전달된 sampler type에 따라 floating point, unsigned integer 또는 signed integer 값으로 반환한다. texture access에 잘못된 sampler type이 사용된 경우, 즉 sampler type이 texture internal format과 일치하지 않으면, 반환되는 값은 OpenGL ES Shading Language 3.00.6에서 undefined이다 (OpenGL ES Shading Language 3.00.6 §8.8). WebGL에서는 대응하는 draw call에서 drawArrays, drawElements, drawArraysInstanced, drawElementsInstanced , 및 drawRangeElements를 포함하여 INVALID_OPERATION 오류를 생성한다.

sampler type이 floating point이고 internal texture format이 normalized integer이면, 이는 match로 간주되며 반환되는 값은 [0, 1] 범위의 floating point로 변환된다.

Queries' results must not be made available in the current frame

OpenGL ES 3.0에서는 적절한 primitives(예: glFinish() 또는 다른 synchronous API)가 호출되면, query의 result가 발행된 동일 frame에서 사용 가능해질 수 있다. WebGL에서는 application portability를 개선하기 위해 query가 발행된 동일 frame에서 query의 result가 application에 사용 가능해져서는 절대 안 된다. 논의 및 rationale은 getQueryParameter의 specification을 보라.

GLSL ES 3.00 #extension directive location

WebGL 1.0 specification section GLSL ES #extension directive location은 OpenGL ES Shading Language 1.00 shaders에만 적용된다. OpenGL ES Shading Language 3.00으로 작성된 shaders에는 적용되지 않는다. OpenGL ES Shading Language 3.00으로 작성된 shaders에서 #extension directives는 extension specification에 무엇이 쓰여 있든 관계없이 non-preprocessor tokens보다 먼저 나타나야 한다.

이는 WebGL 2.0이 작성된 GLSL ES 3.00 specification을 더 밀접하게 따르도록 하기 위한 것이다. native GLES drivers보다 더 엄격하게 제한을 강제하면 동작이 well-defined된다.

Uniform blocks에서는 std140 layout만 지원됨

GLSL ES 3.00 specification은 uniform blocks에 대해 shared, packed, 및 std140 layout qualifiers를 지원하며, uniform buffers의 storage 안에 variables가 어떻게 laid out되는지를 정의한다. 이 중 WebGL 2.0 specification은 OpenGL ES 3.0.6 §2.12 "Vertex Shaders", subsection "Standard Uniform Block Layout"에 정의된 std140 layout만 지원한다. shared 또는 packed layout qualifiers를 사용하려는 shaders는 compilation 또는 linking stages 중 하나에서 실패한다.

compilation의 initial state는 다음이 선언된 것과 같다:

layout(std140) uniform;

이 제한은 특정 vendor의 GPUs에 고유한 uniform block layouts를 노출하는 것을 피함으로써 portability를 개선하기 위해 강제된다.

GLSL ES 3.00 operators의 허용되지 않는 variants

WebGL 2.0 API에서 다음 shading language constructs는 허용되지 않으며, 이를 사용하려는 시도는 compile error를 초래해야 한다:

이 제한은 OpenGL ES 3.0을 지원하는 devices 전반의 쉬운 portability를 보장한다.

checkFramebufferStatus may return FRAMEBUFFER_INCOMPLETE_DIMENSIONS

모든 attached images는 같은 width 및 height를 가져야 한다. 그렇지 않으면 checkFramebufferStatusFRAMEBUFFER_INCOMPLETE_DIMENSIONS를 반환한다.

OpenGL ES 3에서 framebuffer의 attached images는 framebuffer complete가 되기 위해 같은 width 및 height를 가질 필요가 없고, FRAMEBUFFER_INCOMPLETE_DIMENSIONScheckFramebufferStatus의 유효한 return values 중 하나가 아니다. 그러나 Direct3D 11에서는 Windows에서 OpenGL ES 3 behavior가 그 위에서 emulated되며, 모든 render targets는 모든 dimensions에서 같은 size를 가져야 한다(msdn manual page 참조). DirectX 11 위에서 ES3 semantic을 emulation하는 것은 비효율적이다. platforms 전반에 걸쳐 일관된 WebGL 2.0 behaviors를 갖기 위해, 모든 attached images가 같은 width 및 height를 가져야 한다는 OpenGL ES 2 / WebGL 1.0 제한을 WebGL 2.0에서도 유지하는 것은 합리적이다.

Uniform block matching

WebGL 2.0 API에서 layout qualifiers row_majorcolumn_major는 non-matrix variables에만 exclusively 적용되는 경우에도 matched uniform blocks에서 일치해야 한다.

이 uniform block matching rule은 OpenGL ES 3.0 implementations 전반에서 inconsistent한 것으로 알려져 있다.

Framebuffer contents after invalidation

OpenGL ES 3.0에서 invalidateFramebuffer 또는 invalidateSubFramebuffer를 호출한 뒤, 영향을 받은 region의 contents는 사실상 undefined가 된다. WebGL 2.0에서는 contents가 unchanged 상태로 남거나 default values로 cleared되어야 한다. (예: colors 및 stencil은 0, depth는 1.0)

WebGL 2.0 implementations가 invalidateFramebuffer 또는 invalidateSubFramebuffer를 no-op으로 만드는 것은 허용된다.

No ArrayBufferView matching texture type FLOAT_32_UNSIGNED_INT_24_8_REV

ArrayBufferView를 사용하는 texImage2DtexImage3D에서, typeFLOAT_32_UNSIGNED_INT_24_8_REV이고 srcDatanull이 아니면, INVALID_OPERATION을 생성한다.

ArrayBufferView를 사용하는 texSubImage2DtexSubImage3D에서, typeFLOAT_32_UNSIGNED_INT_24_8_REV이면, INVALID_ENUM을 생성한다.

VertexAttrib function must match shader attribute type

다음 상황 중 하나라도 true이면, drawArrays, drawElements, drawRangeElements 또는 그 instanced variants로 draw하려는 시도는 INVALID_OPERATION 오류를 생성한다:

이 undefined behavior는 OpenGL ES 3.0 specification section 2.8에 있다 ( OpenGL ES 3.0.6 §2.8).

Transform feedback primitive capture

output variable이 buffer object로 streamed되도록 지정되었지만 vertex shader가 실제로 쓰지 않았다면, 그 값은 0으로 설정된다.

이 undefined behavior는 OpenGL ES 3.0 specification section 2.15.2에 있다 ( OpenGL ES 3.0.6 §2.15.2).

gl_FragDepth

fragment shader가 gl_FragDepth에 정적으로 값을 할당하는 경우, gl_FragDepth에 값을 할당하는 statements가 실행되지 않는 모든 fragment에서는 값 0이 사용된다.

이 undefined behavior는 OpenGL ES 3.0 specification section 3.9.2에 있다 ( OpenGL ES 3.0.6 §3.9.2).

Framebuffer color attachments

image가 framebuffer 안에서 둘 이상의 color attachment point에 attach되어 있으면, checkFramebufferStatusFRAMEBUFFER_UNSUPPORTED를 반환한다. image는 individual mip level, array slice(2D array 또는 cube map textures 중 하나에서 온), 또는 3D texture slice일 수 있다.

이는 Windows에서 OpenGL ES 3 behavior가 그 위에서 emulated되는 Direct3D 11의 limitation이다. (msdn manual page 참조). platforms 전반에서 일관된 WebGL 2.0 behavior를 갖기 위해, WebGL 2.0의 모든 platforms에 이 limitation을 추가하는 것은 합리적이다.

TexImageSource에서 uploads를 위한 Pixel store parameters

UNPACK_ALIGNMENTUNPACK_ROW_LENGTH는 무시된다. UNPACK_ALIGNMENT는 bytes로 지정되며, TexImageSource objects에 대해 implicit하고 implementation-dependent이다. UNPACK_ROW_LENGTH는 현재 사용되지 않는다.

Subrect selection은 UNPACK_ params를 사용하여 가능하다. UNPACK_SKIP_PIXELSUNPACK_SKIP_ROWS는 subrect의 origin을 결정하며, widthheight arguments는 subrect의 size를 결정한다.

3D textures의 경우, width, height, 및 depth arguments는 unpack할 texel array의 rectangular region을 지정한다. UNPACK_SKIP_IMAGESUNPACK_IMAGE_HEIGHT는 2D source에서 multiple slices를 선택할 수 있게 한다. UNPACK_IMAGE_HEIGHT는 두 slices 사이의 stride를 rows 단위로 결정한다. 예를 들어, 높이가 30 pixels인 TexImageSourceheight를 10으로, UNPACK_IMAGE_HEIGHT를 20으로, depth를 2로 설정하여 upload함으로써 top 10 및 bottom 10 rows를 3D texture의 두 slices로 upload할 수 있다. UNPACK_IMAGE_HEIGHT가 0이면 두 slices 사이의 stride는 rows 단위로 height가 기본값이 된다.

폭이 20 pixels인 HTMLImageElement의 경우, texture upload에 width = 10을 전달하면 image의 왼쪽 절반만 선택되어 upload된다. 결과 texture는 width가 10이 된다. 이 예에서 추가로 UNPACK_SKIP_PIXELS가 10으로 설정되면, image의 오른쪽 절반만 unpack 대상으로 선택된다.

또한 UNPACK_SKIP_IMAGES는 3D entrypoints에만 적용되고, 2D entrypoints에는 적용되지 않는다.

다른 예를 보면, 위의 32x48 image는 16x16 크기의 여섯 colors로 구성되어 있으며, width = 2, height = 1, depth = 3인 3D texture로 upload된다.

Pixel store parameter constraints

정의:

PACK_SKIP_PIXELS + width > DataStoreWidth이면, readPixelsINVALID_OPERATION 오류를 생성한다.

UNPACK_SKIP_PIXELS + width > DataStoreWidth이면, texImage2DtexSubImage2DINVALID_OPERATION 오류를 생성한다. 이는 PIXEL_UNPACK_BUFFER가 bind되어 있지 않고 srcData가 null인 경우의 texImage2D에는 적용되지 않는다.

UNPACK_SKIP_PIXELS + width > DataStoreWidth 또는 UNPACK_SKIP_ROWS + height > DataStoreHeight이면, texImage3DtexSubImage3DINVALID_OPERATION 오류를 생성한다. 이는 PIXEL_UNPACK_BUFFER가 bind되어 있지 않고 srcData가 null인 경우의 texImage3D에는 적용되지 않는다.

이 constraints는 pixels가 저장되는 sub region을 지정하기 위해 이러한 parameters를 사용하는 방식을 normalize한다. 예를 들어 readPixels 경우, 전체 data store의 sub area에 pixels를 저장하려면 PACK_ROW_LENGTH를 사용해 data store width를 지정하고, PACK_SKIP_PIXELS, PACK_SKIP_ROWS, widthheight를 사용해 subarea의 xoffset, yoffset, width, 및 height를 지정할 수 있다.

이 contraints는 OpenGL ES 3.0 DEQP test suites에서 test되지 않고 많은 drivers가 잘못 동작하는 row 및 image overlap 상황도 금지한다. 또한 random pixels 또는 rows를 skip하는 것도 금지하지만, 이는 data store offset을 그에 맞춰 조정하여 달성할 수 있다.

또한 TexImageSource에서 uploads하는 경우 implied UNPACK_ROW_LENGTHUNPACK_ALIGNMENT는 엄격히 정의되어 있지 않다. 이러한 restrictions는 implied UNPACK_ params와 관계없이 일관되고 효율적인 동작을 보장한다.

UNPACK_FLIP_Y_WEBGL 또는 UNPACK_PREMULTIPLY_ALPHA_WEBGL가 true로 설정되어 있으면, texImage2DtexSubImage2DPIXEL_UNPACK_BUFFER에서 data를 upload할 때 INVALID_OPERATION 오류를 생성한다.

UNPACK_FLIP_Y_WEBGL 또는 UNPACK_PREMULTIPLY_ALPHA_WEBGL가 true로 설정되어 있으면, texImage3DtexSubImage3DPIXEL_UNPACK_BUFFER 또는 non-null client side ArrayBufferView에서 data를 upload할 때 INVALID_OPERATION 오류를 생성한다.

No ETC2 and EAC compressed texture formats

OpenGL ES 3.0은 다음 ETC2 및 EAC compressed texture formats에 대한 지원을 요구한다: COMPRESSED_R11_EAC, COMPRESSED_SIGNED_R11_EAC, COMPRESSED_RG11_EAC, COMPRESSED_SIGNED_RG11_EAC, COMPRESSED_RGB8_ETC2, COMPRESSED_SRGB8_ETC2, COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, COMPRESSED_RGBA8_ETC2_EAC, 및 COMPRESSED_SRGB8_ALPHA8_ETC2_EAC.

이 texture formats는 WebGL 2.0에서 기본적으로 지원되지 않는다.

이 formats는 대부분의 desktop GPU hardware에서 natively 지원되지 않는다. 따라서 이 formats를 지원하려면 WebGL implementation 또는 underlying driver에서 software decompression이 필요하다. 이는 video memory usage를 급격히 증가시켜 WebGL application에는 보이지 않는 performance losses를 일으킨다.

ETC2 및 EAC compressed texture formats를 natively 지원하는 hardware (예: mobile OpenGL ES 3.0+ hardware)에서는 extension WEBGL_compressed_texture_etc를 통해 노출될 수 있다.

UNIFORM_BUFFER_OFFSET_ALIGNMENT의 값은 4로 나누어떨어져야 한다

basic machine units로 주어지는 UNIFORM_BUFFER_OFFSET_ALIGNMENT의 값은 4로 나누어떨어져야 한다.

UNIFORM_BUFFER_OFFSET_ALIGNMENT의 값이 4로 나누어떨어지지 않으면, BindBufferRange로 bind된 uniform buffers에 ArrayBuffers를 upload하는 것이 비현실적이 된다.

Sync objects' results must not be made available in the current frame

OpenGL ES 3.0에서는 적절한 primitives(예: glFinish() 또는 다른 synchronous API)가 호출되면, sync object가 발행된 동일 frame에서 signaled될 수 있다. WebGL에서는 application portability를 개선하기 위해 sync object가 발행된 동일 frame에서 signaled state로 transition해서는 절대 안 된다. 논의 및 rationale은 getSyncParameterclientWaitSync의 specification을 보라.

blitFramebuffer rectangle width/height limitations

blitFramebuffer() src* 및 dst* parameters는 결과 source 및 destination rectangles의 width와 height가 GLint에 저장할 수 있는 maximum value보다 작거나 같도록 설정되어야 한다. width 또는 height 값 중 하나를 GLint로 계산한 결과 integer overflow가 발생하는 경우, blitFramebuffer()INVALID_VALUE 오류를 생성한다.

max 32-bit int보다 큰 rectangles를 blitFramebuffer에 사용하면 대부분의 desktop OpenGL drivers에서 문제가 trigger되며, blitFramebuffer가 framebuffer를 scale하는 데 사용되는 경우에는 일반적인 workaround가 없다.

GenerateMipmap requires positive image dimensions

generateMipmap은 TEXTURE_BASE_LEVEL의 dimensions가 모두 positive일 것을 요구한다.

GLES 3.0.6은 기술적으로 0x0 images에 대해 GenerateMipmap을 호출하는 것을 허용하지만, cubemaps는 cube-complete여야 하므로 positive dimensions를 가져야 한다.
이 변경은 textures에 대한 base-level-completeness 개념을 허용하여 implementations를 단순화한다. 이는 non-mipmap-sampled validation에 어차피 필요하다. GenerateMipmap은 0x0 texture에 아무 효과도 없고, WebGL 1에서는 illegal(0은 power of two가 아님)이므로, 이는 쉽게 추가할 수 있는 restriction이다. 또한 GenerateMipmap은 그렇지 않으면 undefined texture images에서 동작해야 하는 유일한 entrypoint가 되어, otherwise-common validation을 skip하게 된다.

deleteQuery implicitly calls endQuery if the query is active

GLES에서 DeleteQueries는 queries가 active인 경우에도 implicitly end하지 않는다.

이 deviation은 원래 specified되지 않았지만 conformance tests를 통해 browsers 전반에서 implicitly standardized되었다. 일부 implementations는 이 동작이 구현하기 더 단순하다고 보았다. 이 동작을 GLES specs와 일치하도록 되돌리면 content가 깨질 수 있으며, 이 시점에서는 우리가 구현한 것을 spec으로 명시하는 것이 더 낫다.

Required compressed texture formats

Implementations는 compressed texture formats의 suite 중 적어도 하나를 지원해야 한다.


Implementations는 다음을 지원해야 한다:

우리의 ecosystem을 가장 잘 지원하기 위해, implementations가 ETC2/EAC formats(GLES3 또는 유사 drivers, 예를 들어 많은 phones에서 보편적) 또는 S3TC formats(그 외 모든 drivers에서 보편적) 중 하나를 지원하도록 요구한다. 이는 authors가 모든 devices에서 compressed textures(srgb variants 포함)를 항상 사용할 수 있음을 보장하면서, 두 가지 format만큼 적은 수의 formats에 대한 support를 유지할 수 있게 한다.

각 suite에는 다음 uses에 대해 대략 equivalent한 formats가 있다:

Usage S3TC/RGTC option (desktop) ETC2/EAC option (mobile)
R11 unsigned COMPRESSED_RED_RGTC1_EXT COMPRESSED_R11_EAC
R11 signed COMPRESSED_SIGNED_RED_RGTC1_EXT COMPRESSED_SIGNED_R11_EAC
RG11 unsigned COMPRESSED_RED_GREEN_RGTC2_EXT COMPRESSED_RG11_EAC
RG11 signed COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT COMPRESSED_SIGNED_RG11_EAC
RGB8 unsigned COMPRESSED_RGB_S3TC_DXT1_EXT COMPRESSED_RGB8_ETC2
RGB8 sRGB COMPRESSED_SRGB_S3TC_DXT1_EXT COMPRESSED_SRGB8_ETC2
RGB8 punchthrough unsigned COMPRESSED_RGBA_S3TC_DXT1_EXT COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
RGB8 punchthrough sRGB COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
RGBA8 unsigned COMPRESSED_RGBA_S3TC_DXT5_EXT COMPRESSED_RGBA8_ETC2_EAC
RGBA8 sRGB COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT COMPRESSED_SRGB8_ALPHA8_ETC2_EAC

예: sampler2DShadow는 예컨대 LINEAR filtering을 보장하지 않는다

TEXTURE_COMPARE_MODE가 COMPARE_REF_TO_TEXTURE로 설정되어 있으면, 필요한 extensions 없이 LINEAR filtering을 사용하더라도 texture는 항상 complete하다. 그러나 LINEAR filtering이 발생하는지 여부는 implementation-defined이다. (Implementations는 대신 NEAREST sampling을 수행할 수 있다)

이 functionality는 GLES에서 underspecified되어 있다. 이는 흔하지만 보편적이지는 않다. 여기서는 liberal하게 선택하지만, implementations는 이 functionality에 대한 requests에 warning을 표시할 수 있다.

Clamped Constant Blend Color

underlying platform이 동일하게 동작할 때 implementations는 store 시 constant blend color를 clamp할 수 있다. Applications는 effective behavior를 확인하기 위해 BLEND_COLOR parameter를 query할 수 있다.

Generic TRANSFORM_FEEDBACK_BUFFER state location

TRANSFORM_FEEDBACK_BUFFER generic buffer binding point는 per-object state가 아니라 context state로 이동되었다.

OpenGL ES 3.2에서도 유사한 변경이 이루어졌다.

Uninitialized Compressed Textures

OpenGL ES 2.0 specification은 uninitialized data로 compressed 2D texture를 생성할 수 있어야 하는지 여부를 선언하지 않았다. WebGL 1.0에서는 이것이 명시적으로 disallowed된다.

OpenGL ES 3.0에서는 glCompressedTexImage2Dnull을 전달하여 uninitialized data로 compressed 2D texture를 생성하는 것이 명시적으로 허용된다. 그러나 WebGL 2.0에서는 이것이 여전히 명시적으로 disallowed된다. Users는 compressed internal format과 함께 texStorage2D를 사용하여 zero-initialized compressed textures를 allocate할 수 있다. 그러나 이러한 textures는 immutable이며, compressedTexImage2D를 통해 allocate된 textures와 완전히 compatible하지는 않다.

References

[WEBGL10]
WebGL Specification 1.0.4 Editor's Draft, Dean Jackson, Jeff Gilbert.
[CANVAS]
HTML5: The Canvas Element, World Wide Web Consortium (W3C).
[OFFSCREENCANVAS]
HTML Living Standard - The OffscreenCanvas interface, WHATWG.
[CANVASCONTEXTS]
Canvas Context Registry, WHATWG.
[GLES30]
OpenGL® ES Version 3.0.6, J. Leech, B. Lipchak, August 2019.
[GLES30GLSL]
The OpenGL® ES Shading Language Version 3.00.6, R. Simpson, January 2016.
[REGISTRY]
WebGL Extension Registry
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels, S. Bradner. IETF, March 1997.
[WEBIDL]
Web IDL - Living Standard, E. Chen, T. Gu, B. Zbarsky, C. McCormack, T. Langel.