webgl 2.0规范(上)

541 阅读50分钟

摘要

这是 WebGL 规范的 2.0 版本。

本规范描述了一个附加的渲染上下文和支持对象,用于 HTML 5 的画布元素 [CANVAS]。这个上下文允许使用一个与 OpenGL ES 3.0 API 密切一致的 API 进行渲染。

这份文件应被视为 WebGL 1.0 规范的扩展。它仅会描述与 1.0 版本之间的差异。

文档状态

这份文件是编辑草案。请勿将此文件引用为除了正在进行的工作之外的其他内容。

反馈

欢迎在 public_webgl@khronos.org 邮件列表(指南、档案)上进行此规范的公开讨论。

请在问题跟踪器中提交与规范或其符合性测试相关的错误报告。我们欢迎在 GitHub 存储库上提交拉取请求。

1.引言

WebGL™ 是一种专为网络设计的即时模式 3D 渲染 API。它派生自 OpenGL® ES 2.0,并提供类似的渲染功能,但在 HTML 上下文中使用。WebGL 被设计为 HTML 画布元素的渲染上下文。HTML 画布为网页中的编程渲染提供了一个目标,允许使用不同的渲染 API 进行渲染。Canvas 规范中唯一描述的接口是 2D 画布渲染上下文,CanvasRenderingContext2D。本文档描述了另一个类似的接口,即 WebGLRenderingContext,它呈现 WebGL API。

API 的即时模式性质是与大多数网络 API 不同之处。鉴于 3D 图形的许多用例,WebGL 选择了提供灵活的原语,适用于任何用例。库可以在 WebGL 之上提供更适用于特定领域的 API,从而为 WebGL 添加了一个便捷层,可以加速和简化开发。然而,由于它的 OpenGL ES 2.0 继承,对于熟悉现代桌面 OpenGL 或 OpenGL ES 2.0 开发的开发人员来说,过渡到 WebGL 开发应该是直接的。

1.1 约定

本文档中描述的许多函数都包含到 OpenGL ES 手册的链接。尽最大努力使这些页面与 OpenGL ES 2.0 规范 [GLES20] 匹配,但它们可能包含错误。在出现矛盾的情况下,OpenGL ES 2.0 规范是最终的权威。

本文档的其余部分应与 OpenGL ES 2.0 规范(本文写作时为 2.0.25 版本,可以从 Khronos OpenGL ES API 注册处获取)一起阅读。除非另有说明,每个方法的行为都由 OpenGL ES 2.0 规范定义。为了确保互操作性或安全性,本规范可能会与 OpenGL ES 2.0 有所不同,通常定义了 OpenGL ES 2.0 未定义的实现定义领域。这些差异在“WebGL 与 OpenGL ES 2.0 之间的区别”部分中有总结。

2 上下文创建和绘图缓冲呈现

在使用 WebGL API 之前,作者必须为给定的 HTMLCanvasElement ([CANVAS]) 或 OffscreenCanvas ([OFFSCREENCANVAS]) 获取一个 WebGLRenderingContext 对象,如下所述。这个对象用于管理 OpenGL 状态并渲染到绘图缓冲区,在上下文创建时必须创建绘图缓冲区。

2.1 上下文创建

每个 WebGLRenderingContext 都有一个关联的 canvas,在创建时设置,它可以是一个 canvas [CANVAS] 或离屏 canvas [OFFSCREENCANVAS]。

每个 WebGLRenderingContext 都有上下文创建参数,在创建时在一个 WebGLContextAttributes 对象中设置。

每个 WebGLRenderingContext 都有实际上下文参数,在每次创建绘图缓冲区时,在一个 WebGLContextAttributes 对象中设置。

每个 WebGLRenderingContext 都有一个 WebGL 上下文丢失标志,在初始状态下未设置。

canvas 元素或离屏 canvas 对象的 getContext() 方法要返回一个新的用于 contextId webgl ([CANVASCONTEXTS]) 的对象时,用户代理必须执行以下步骤:

  1. 创建一个新的 WebGLRenderingContext 对象,命名为 context
  2. context 的 canvas 为与 getContext() 方法关联的 canvas 或离屏 canvas。
  3. 创建一个新的 WebGLContextAttributes 对象,命名为 contextAttributes
  4. 如果 getContext() 是通过第二个参数 options 调用的,则从 options 中的指定属性设置 contextAttributes 的属性。
  5. 使用在 contextAttributes 中指定的设置创建绘图缓冲区,并将绘图缓冲区与 context 关联。
  6. 如果绘图缓冲区的创建失败,则执行以下步骤:
    • canvas 上触发一个 WebGL 上下文创建错误事件。
    • 返回 null 并终止这些步骤。
  7. 创建一个新的 WebGLContextAttributes 对象,命名为 actualAttributes
  8. 基于新创建的绘图缓冲区的属性设置 actualAttributes 的属性。
  9. context 的上下文创建参数设置为 contextAttributes
  10. context 的实际上下文参数设置为 actualAttributes
  11. 返回 context

experimental-webgl 画布上下文类型在历史上被用来访问那些尚未完整或符合规范的 WebGL 实现。

如果用户代理同时支持 webglexperimental-webgl 画布上下文类型,它们应被视为别名。例如,如果调用 getContext('webgl') 成功创建了一个 WebGLRenderingContext,随后对 getContext('experimental-webgl') 的调用应返回同一个上下文对象。

2.2 绘制缓冲区

与WebGL 1.0不同,WebGL 2.0中的深度、模板和抗锯齿属性必须由WebGL实现遵守。

3 Dom接口

本节描述了添加到DOM的接口和功能,以支持对上述描述的功能的运行时访问。

3.1 类型

在WebGL 2.0中引入了以下类型。

typedef long long GLint64;
typedef unsigned long long GLuint64;

3.2 WebGLQuery

WebGLQuery 类型在 WebGL 2.0 中引入。它用于查询和检索 GPU 中的信息,例如时间戳和时间间隔。

3.3 WebGLSampler

WebGLSampler 类型是 WebGL 2.0 中的一种对象,用于定义纹理采样参数,如过滤器和边缘包装模式。

3.4 WebGLSync

WebGLSync 类型用于同步 GPU 操作,它可以用于等待 GPU 完成或查询 GPU 操作是否已完成。

3.5 WebGLTransformFeedback

WebGLTransformFeedback 类型用于配置和操作变换反馈操作,允许将顶点数据传递回缓冲区,以便在 GPU 中进行后续处理。

3.6 WebGLVertexArrayObject

WebGLVertexArrayObject 类型是用于保存和管理顶点数组对象状态的对象。顶点数组对象包括顶点属性状态和元素数组缓冲区状态。

3.7 The WebGL context

The 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 RGBA8                                         = 0x8058;
  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 GLuint 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,
                       GLuint 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 GLuint 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 GLuint 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 GLuint 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 GLuint srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniform2uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniform3uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniform4uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
                        optional GLuint srcLength = 0);
  undefined uniformMatrix3x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix4x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional GLuint srcOffset = 0, optional GLuint srcLength = 0);

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

  undefined uniformMatrix2x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix3x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                               optional GLuint 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 GLuint srcOffset = 0);
  undefined clearBufferiv(GLenum buffer, GLint drawbuffer, Int32List values,
                          optional GLuint srcOffset = 0);
  undefined clearBufferuiv(GLenum buffer, GLint drawbuffer, Uint32List values,
                           optional GLuint 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, GLuint srcOffset,
                       optional GLuint length = 0);
  undefined bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData,
                          GLuint 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,
                       GLuint 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,
                          GLuint 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 GLuint 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 GLuint srcOffset = 0,
                                    optional GLuint srcLengthOverride = 0);

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

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

  undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                             optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                             optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
  undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
                             optional GLuint 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, GLuint dstOffset);
};

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

3.7.1 更多绑定点

在 WebGL 2.0 中,引入了更多的绑定点,包括用于统一变量缓冲区、像素解包缓冲区等的绑定点。

1.void bindBuffer(GLenum target, WebGLBuffer? buffer) (OpenGL ES 3.0.6 §2.10.1man page)
  • 将给定的 WebGLBuffer 对象绑定到给定的绑定点(目标)。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 的内容

2.void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer) (OpenGL ES 3.0.6 §4.4.1man page)
  • 将给定的 WebGLFramebuffer 对象绑定到给定的绑定点(目标)。target 的取值如下表所示:

    target
    FRAMEBUFFER
    READ_FRAMEBUFFER
    DRAW_FRAMEBUFFER

如果 target 不在上述表格中的取值范围内,则会生成一个 INVALID_ENUM 错误。

3.void bindTexture(GLenum target, WebGLTexture? texture) (OpenGL ES 3.0.6 §3.8.1man page)
  • 将给定的 WebGLTexture 对象绑定到给定的绑定点(目标)。target 的取值如下表所示:

    target
    TEXTURE_2D
    TEXTURE_3D
    TEXTURE_2D_ARRAY
    TEXTURE_CUBE_MAP

如果 target 不在上述表格中的取值范围内,则会生成一个 INVALID_ENUM 错误。

3.7.2 设置和获取状态

描述了如何设置和获取 WebGL 上下文的状态,包括启用/禁用功能、设置清除颜色等。

1.[any getParameter]()(GLenum pname) (OpenGL ES 3.0.6 §6.1.1glGet OpenGL ES 3.0 man pageglGetString OpenGL ES 3.0 man page)
  • 返回传递的 pname 所对应的值。除了支持 WebGL 1.0 中的所有 pname/type 值外,还支持以下参数:

    pnamereturned type
    COPY_READ_BUFFER_BINDINGWebGLBuffer
    COPY_WRITE_BUFFER_BINDINGWebGLBuffer
    DRAW_BUFFERiGLenum
    DRAW_FRAMEBUFFER_BINDINGWebGLFramebuffer
    FRAGMENT_SHADER_DERIVATIVE_HINTGLenum
    MAX_3D_TEXTURE_SIZEGLint
    MAX_ARRAY_TEXTURE_LAYERSGLint
    MAX_CLIENT_WAIT_TIMEOUT_WEBGLGLint64
    MAX_COLOR_ATTACHMENTSGLint
    MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTSGLint64
    MAX_COMBINED_UNIFORM_BLOCKSGLint
    MAX_COMBINED_VERTEX_UNIFORM_COMPONENTSGLint64
    MAX_DRAW_BUFFERSGLint
    MAX_ELEMENT_INDEXGLint64
    MAX_ELEMENTS_INDICESGLint
    MAX_ELEMENTS_VERTICESGLint
    MAX_FRAGMENT_INPUT_COMPONENTSGLint
    MAX_FRAGMENT_UNIFORM_BLOCKSGLint
    MAX_FRAGMENT_UNIFORM_COMPONENTSGLint
    MAX_PROGRAM_TEXEL_OFFSETGLint
    MAX_SAMPLESGLint
    MAX_SERVER_WAIT_TIMEOUTGLint64
    MAX_TEXTURE_LOD_BIASGLfloat
    MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTSGLint
    MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBSGLint
    MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTSGLint
    MAX_UNIFORM_BLOCK_SIZEGLint64
    MAX_UNIFORM_BUFFER_BINDINGSGLint
    MAX_VARYING_COMPONENTSGLint
    MAX_VERTEX_OUTPUT_COMPONENTSGLint
    MAX_VERTEX_UNIFORM_BLOCKSGLint
    MAX_VERTEX_UNIFORM_COMPONENTSGLint
    MIN_PROGRAM_TEXEL_OFFSETGLint
    PACK_ROW_LENGTHGLint
    PACK_SKIP_PIXELSGLint
    PACK_SKIP_ROWSGLint
    PIXEL_PACK_BUFFER_BINDINGWebGLBuffer
    PIXEL_UNPACK_BUFFER_BINDINGWebGLBuffer
    RASTERIZER_DISCARDGLboolean
    READ_BUFFERGLenum
    READ_FRAMEBUFFER_BINDINGWebGLFramebuffer
    SAMPLER_BINDINGWebGLSampler
    TEXTURE_BINDING_2D_ARRAYWebGLTexture
    TEXTURE_BINDING_3DWebGLTexture
    TRANSFORM_FEEDBACK_ACTIVEGLboolean
    TRANSFORM_FEEDBACK_BINDINGWebGLTransformFeedback
    TRANSFORM_FEEDBACK_BUFFER_BINDINGWebGLBuffer
    TRANSFORM_FEEDBACK_PAUSEDGLboolean
    UNIFORM_BUFFER_BINDINGWebGLBuffer
    UNIFORM_BUFFER_OFFSET_ALIGNMENTGLint
    UNPACK_IMAGE_HEIGHTGLint
    UNPACK_ROW_LENGTHGLint
    UNPACK_SKIP_IMAGESGLint
    UNPACK_SKIP_PIXELSGLint
    UNPACK_SKIP_ROWSGLint
    VERTEX_ARRAY_BINDINGWebGLVertexArrayObject

所有返回序列或类型数组的查询每次都会返回一个新的对象。

如果 pname 不在上述表格中,并且也不是 WebGL 1.0 支持的参数名称之一,将会生成一个 INVALID_ENUM 错误,并返回 null。

以下的 pname 参数返回一个描述当前 WebGL 实现某个方面的字符串:

  • VERSIONReturns a version or release number of the form WebGL<space>2.0<optional><space><vendor-specific information></optional>.
    SHADING_LANGUAGE_VERSIONReturns a version or release number of the form WebGL<space>GLSL<space>ES<space>3.00<optional><space><vendor-specific information></optional>.

    对于 RED_BITSGREEN_BITSBLUE_BITSALPHA_BITS,如果绘制帧缓冲区的活动颜色附件具有不同的格式,将生成一个 INVALID_OPERATION 错误并返回 0。

2.any getIndexedParameter(GLenum target, GLuint index) (OpenGL ES 3.0.6 §6.1.1glGet OpenGL ES 3.0 man page)
  • 返回传递的 target 的索引值。返回的类型是请求的 pname 的自然类型,如下表所示:

    targetreturned type
    TRANSFORM_FEEDBACK_BUFFER_BINDINGWebGLBuffer
    TRANSFORM_FEEDBACK_BUFFER_SIZEGLsizeiptr
    TRANSFORM_FEEDBACK_BUFFER_STARTGLintptr
    UNIFORM_BUFFER_BINDINGWebGLBuffer
    UNIFORM_BUFFER_SIZEGLsizeiptr
    UNIFORM_BUFFER_STARTGLintptr

如果 target 不在上述表格中,将生成一个 INVALID_ENUM 错误。

如果 index 超出了索引状态 target 的有效范围,将生成一个 INVALID_VALUE 错误。

如果生成了 OpenGL 错误,将返回 null。

3.[GLboolean isEnabled]()(GLenum cap) (OpenGL ES 3.0.6 §6.1.1OpenGL ES 3.0 man page)
  • 除了来自 WebGL 1.0 的所有 cap 值外,还支持 RASTERIZER_DISCARD。
4. void pixelStorei(GLenum pname, GLint param) (OpenGL ES 3.0.6 §3.7.1OpenGL ES 3.0 man page)
  • 除了来自 WebGL 1.0 的参数外,WebGL 2.0 规范还接受以下额外的参数:

    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

3.7.3 缓冲对象

描述了在 WebGL 中如何操作缓冲对象,包括创建、绑定、写入数据等操作。

1. void bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, GLuint srcOffset, optional GLuint length = 0);(OpenGL ES 3.0.6 §2.10.2man page)
  • 设置当前绑定的 WebGLBuffer 对象的大小,然后将 srcData 的子区域复制到缓冲区对象。

    让 buf 为绑定到 target 的缓冲区。

如果 length 为 0:

  • 若 srcData 为 DataView,让 copyLength 为 srcData.byteLength - srcOffset;下文中的类型元素是字节。
  • 否则,让 copyLength 为 srcData.length - srcOffset

否则,让 copyLength 为 length

  • 如果 srcData 为 DataView,将 buf 的大小设置为 copyLength;否则,将 buf 的大小设置为 copyLength * srcData.BYTES_PER_ELEMENT

  • 如果 srcData 为 DataView,让 elementSize 为 1;否则,让 elementSize 为 srcData.BYTES_PER_ELEMENT

  • 若 copyLength 大于零,将 srcData 中从元素索引 srcOffset 开始读取的 copyLength 个类型元素(每个大小为 elementSize)复制到 buf,如果 copyLength 为 0,则不向 buf 写入数据,但这不会引发 GL 错误。

  • 若没有 WebGLBuffer 绑定到 target,生成 INVALID_OPERATION 错误。

  • 若 srcOffset 大于 srcData.length (或 DataView 的 srcData.byteLength),生成 INVALID_VALUE 错误。

  • 若 srcOffset + copyLength 大于 srcData.length (或 DataView 的 srcData.byteLength),生成 INVALID_VALUE 错误。

若生成任何错误,buf 的大小保持不变,且不会向其写入数据。

2. void bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData, GLuint srcOffset, optional GLuint length = 0); (OpenGL ES 3.0.6 §2.10.2man page)
  • 将 srcData 的子区域复制到当前绑定的 WebGLBuffer 对象。

    让 buf 成为绑定到 target 的缓冲区。

如果 length 为 0:

  • 如果 srcData 是一个 DataView,那么 copyLength 为 srcData.byteLength - srcOffset;以下文中的数据类型元素是字节。
  • 否则,让 copyLength 为 srcData.length - srcOffset

否则,让 copyLength 为 length

如果 srcData 是一个 DataView,将 buf 的大小设置为 copyLength;否则,将 buf 的大小设置为 copyLength * srcData.BYTES_PER_ELEMENT

如果 srcData 是一个 DataView,让 elementSize 为 1;否则,让 elementSize 为 srcData.BYTES_PER_ELEMENT

如果 copyLength 大于零,则将 srcData 中从元素索引 srcOffset 开始的 copyLength 个数据(每个大小为 elementSize)复制到 buf,写入从字节偏移 dstByteOffset 开始的位置。如果 copyLength 为 0,则不向 buf 写入数据,但这不会引发 GL 错误。

  • 如果没有 WebGLBuffer 绑定到 target,会生成 INVALID_OPERATION 错误。
  • 如果 dstByteOffset 小于零,则会生成 INVALID_VALUE 错误。
  • 如果 dstByteOffset + copyByteLength 大于 buf 的大小,则会生成 INVALID_VALUE 错误。
  • 如果 srcOffset 大于 srcData.length(对于 DataView 而言是 srcData.byteLength),则会生成 INVALID_VALUE 错误。
  • 如果 srcOffset + copyLength 大于 srcData.length(对于 DataView 而言是 srcData.byteLength),则会生成 INVALID_VALUE 错误。

如果生成了任何错误,则不会向 buf 写入数据。

3. any getBufferParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.9man page)
  • 返回传递的 pname 的值。除了支持查询 pname 为 BUFFER_USAGE(与 WebGL 1.0 中相同),查询 pname 为 BUFFER_SIZE 将以类型为 GLsizeiptr 的值返回缓冲区的大小。
4.void copyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) (OpenGL ES 3.0.6 §2.10.5man page)
  • 将绑定到 readTarget 的缓冲区的一部分数据复制到绑定到 writeTarget 的缓冲区中。请参阅复制缓冲区以获取 WebGL 2.0 API 强加的限制。
5 undefined getBufferSubData(GLenum target, GLintptr srcByteOffset, [AllowShared] ArrayBufferView dstBuffer, optional GLuint dstOffset = 0, optional GLuint length = 0)
  • 从绑定到 WebGLBuffer 的缓冲区中读取数据并写入到 dstBuffer 中。

    buf 为绑定到 target 的缓冲区。

    如果 length 为 0:

    • 如果 dstBuffer 是一个 DataView,则令 copyLengthdstBuffer.byteLength - dstOffset;下文中的类型元素是以字节为单位的。
    • 否则,令 copyLengthdstBuffer.length - dstOffset

    否则,令 copyLengthlength

    如果 dstBuffer 是一个 DataView,则令 copyByteLengthcopyLength;否则,令 copyByteLengthcopyLength * dstBuffer.BYTES_PER_ELEMENT

    如果 dstBuffer 是一个 DataView,则令 elementSize 为 1;否则,令 elementSizedstBuffer.BYTES_PER_ELEMENT

    如果 copyLength 大于零,从 buf 中复制 copyLength 个类型元素(每个大小为 elementSize)到 dstBuffer 中,从 buf 中以字节索引 srcByteOffset 开始读取,从 dstBuffer 中以元素索引 dstOffset 开始写入。如果 copyLength 为 0,则不会向 dstBuffer 写入数据,但这不会导致生成 GL 错误。

    • 如果没有 WebGLBuffer 绑定到 target,则生成一个 INVALID_OPERATION 错误。
    • 如果 targetTRANSFORM_FEEDBACK_BUFFER,并且当前有任何变换反馈对象处于活动状态,则生成一个 INVALID_OPERATION 错误。
    • 如果 dstOffset 大于 dstBuffer.length(或 dstBuffer.byteLengthDataView 的情况下),则生成一个 INVALID_VALUE 错误。
    • 如果 dstOffset + copyLength 大于 dstBuffer.length(或 dstBuffer.byteLengthDataView 的情况下),则生成一个 INVALID_VALUE 错误。
    • 如果 srcByteOffset 小于零,则生成一个 INVALID_VALUE 错误。
    • 如果 srcByteOffset + copyByteLength 大于 buf 的大小,则生成一个 INVALID_OPERATION 错误。

    如果产生任何错误,不会向 dstBuffer 写入数据。

    如果缓冲区被其他操作和 getBufferSubData 顺序写入和读取,WebGL API有责任确保数据被一致地访问。即使缓冲区当前绑定到变换反馈绑定点,此规则也适用。

这是一个阻塞操作,因为WebGL必须完全完成对源缓冲区的所有先前写操作,以便返回结果。在多进程的WebGL实现中,getBufferSubData 也可能会产生昂贵的进程间往返开销,以从远程进程获取结果。 用户可以通过发出从缓冲区读回的意图来避免这些成本:

  • 在写入源缓冲区后插入 fenceSync,并在执行 getBufferSubData 操作之前等待它通过。
  • 如果要将缓冲区用作读回源,可以使用 _READ 使用提示来分配缓冲区。(避免过多地使用使用 _READ 使用提示分配的缓冲区,因为它们可能会在维护缓冲区数据的阴影副本方面产生开销。)

3.7.4 帧缓冲对象

介绍了帧缓冲对象的概念和操作,包括创建、绑定、附加颜色和深度缓冲等。

1.[WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target) (OpenGL ES 3.0.6 §4.4.4.2man page)
  • 与 WebGL 1.0 中的 checkFramebufferStatus 的唯一不同之处在此处描述。

  • target 必须是 DRAW_FRAMEBUFFERREAD_FRAMEBUFFERFRAMEBUFFERFRAMEBUFFER 等效于 DRAW_FRAMEBUFFER

  • 如果深度和模板附件(如果存在)不是相同的图像,则返回 FRAMEBUFFER_UNSUPPORTED。详细讨论请参见 Framebuffer Object Attachments

  • 如果附加的渲染缓冲区中的 RENDERBUFFER_SAMPLES 的值不同,或者如果附加的图像是渲染缓冲区和纹理的混合并且非零,则返回 FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

  • 如果附加的图像的宽度、高度和深度(对于3D纹理)或数组大小(对于2D数组纹理)不同,则返回 FRAMEBUFFER_INCOMPLETE_DIMENSIONS。参见 checkFramebufferStatus may return FRAMEBUFFER_INCOMPLETE_DIMENSIONS

  • 如果相同的图像附加到多个颜色附件点,则返回 FRAMEBUFFER_UNSUPPORTED。参见 Framebuffer color attachments

2.any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname) (OpenGL ES 3.0.6 §6.1.13, similar to glGetFramebufferAttachmentParameteriv)
  • 根据传递的目标和附件,返回给定的 pname 的值。返回的类型是请求的 pname 的自然类型,如下表所示:

    pnamereturned type
    FRAMEBUFFER_ATTACHMENT_ALPHA_SIZEGLint
    FRAMEBUFFER_ATTACHMENT_BLUE_SIZEGLint
    FRAMEBUFFER_ATTACHMENT_COLOR_ENCODINGGLenum
    FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPEGLenum
    FRAMEBUFFER_ATTACHMENT_DEPTH_SIZEGLint
    FRAMEBUFFER_ATTACHMENT_GREEN_SIZEGLint
    FRAMEBUFFER_ATTACHMENT_OBJECT_NAMEWebGLRenderbuffer or WebGLTexture
    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPEGLenum
    FRAMEBUFFER_ATTACHMENT_RED_SIZEGLint
    FRAMEBUFFER_ATTACHMENT_STENCIL_SIZEGLint
    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACEGLint
    FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYERGLint
    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVELGLint
  • 如果 pname 不在上述表格中,将生成一个 INVALID_ENUM 错误。

  • 如果生成了一个 OpenGL 错误,返回 null。

  • 如果 attachmentDEPTH_STENCIL_ATTACHMENT 并且不同的图像附加到深度和模板附件点,将生成一个 INVALID_OPERATION 错误。详细讨论请参阅帧缓冲对象附件

3.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.3man page)
  • 同时是一个[读取操作]和一个[绘制操作]
  • 将像素值的矩形从读取帧缓冲的一个区域传输到绘制帧缓冲的另一个区域。如果读取帧缓冲的 SAMPLE_BUFFERS 的值为 1,而绘制帧缓冲的 SAMPLE_BUFFERS 的值为 0,则会将源中每个像素位置对应的样本转换为单个样本,然后写入目标帧缓冲。
  • 任何中心对应于源缓冲区之外点的目标像素保持不变。
  • 当传输到 WebGL 上下文默认后备缓冲的颜色附件时,以 alpha:false 创建的上下文被视为具有内部格式 RGB8,而以 alpha:true 创建的上下文被视为具有内部格式 RGBA8
  • 如果此函数尝试传输到完整帧缓冲的丢失附件,那么不会传输到该附件,并且不会生成错误,参考对丢失附件进行绘制
  • 如果此函数尝试从完整帧缓冲的丢失附件读取,并且至少有一个绘制缓冲区具有要传输的图像,将生成一个 INVALID_OPERATION 错误,参考从丢失附件读取
4.void framebufferTextureLayer(GLenum target, GLenum attachment, WebGLTexture? texture, GLint level, GLint layer) (OpenGL ES 3.0.6 §4.4.2.4man page)
  • 如果 texture 是由不同的 WebGL2RenderingContext 创建的,会生成一个 INVALID_OPERATION 错误。
5.void invalidateFramebuffer(GLenum target, sequence<GLenum> attachments) (OpenGL ES 3.0.6 §4.5man page)
  • 一个[绘制操作]
  • 等效于调用 invalidateSubFramebuffer,将 xy 设置为 0,将 widthheight 设置为最大帧缓冲对象附件的宽度和高度。
6.void invalidateSubFramebuffer (GLenum target, sequence<GLenum> attachments, GLint x, GLint y, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.5man page)
  • 一个[绘制操作]
  • 向 GL 发送信号,无需保留绑定的帧缓冲对象的所有内容。
7.void readBuffer(GLenum src) (OpenGL ES 3.0.6 §4.3.1man page)
  • 将读取帧缓冲区的一个颜色缓冲指定为读取缓冲区。

3.7.5 渲染缓冲对象

描述了渲染缓冲对象的作用和操作,用于存储深度、模板等渲染数据。

1.any getInternalformatParameter(GLenum target, GLenum internalformat, GLenum pname) (OpenGL ES 3.0.6 §6.1.15man page)
  • 返回给定目标和内部格式的传递pname的值。返回的类型在以下表格中给出:

    pnamereturned type
    SAMPLESInt32Array

    如果pname不在上述表格中,会生成一个INVALID_ENUM错误。

    如果生成了OpenGL错误,则返回null。

    每次查询SAMPLES都会返回一个新的类型化数组对象实例。

2 any getRenderbufferParameter(GLenum target, GLenum pname) (OpenGL ES 2.0 §6.1.14, similar to glGetRenderbufferParameteriv)
  • 根据传入的pnametarget返回对应的值。返回的类型是请求的pname的自然类型,如下表所示:

    pnamereturned type
    RENDERBUFFER_WIDTHGLint
    RENDERBUFFER_HEIGHTGLint
    RENDERBUFFER_INTERNAL_FORMATGLenum
    RENDERBUFFER_RED_SIZEGLint
    RENDERBUFFER_GREEN_SIZEGLint
    RENDERBUFFER_BLUE_SIZEGLint
    RENDERBUFFER_ALPHA_SIZEGLint
    RENDERBUFFER_DEPTH_SIZEGLint
    RENDERBUFFER_SAMPLESGLint
    RENDERBUFFER_STENCIL_SIZEGLint

    如果pname不在上述表格中,会生成一个INVALID_ENUM错误。

    如果生成了OpenGL错误,则返回null。

3.void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.4.2.1man page)
  • 接受来自OpenGL ES 3.0的内部格式,详情请参考规范手册

    为了与WebGL 1向后兼容,还接受内部格式DEPTH_STENCIL,在实现中应映射为DEPTH24_STENCIL8

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

internalFormat == DEPTH_STENCILsamples > 0时,会生成INVALID_OPERATION错误。

3.7.6 纹理对象

介绍了纹理对象的创建、绑定和操作,包括设置纹理参数、加载图像数据等。

1.any getTexParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.3man page)
  • 返回给定目标的传递的pname的值。返回的类型是请求的pname在以下表格中给出的自然类型:

    pnamereturned type
    TEXTURE_BASE_LEVELGLint
    TEXTURE_COMPARE_FUNCGLenum
    TEXTURE_COMPARE_MODEGLenum
    TEXTURE_IMMUTABLE_FORMATGLboolean
    TEXTURE_IMMUTABLE_LEVELSGLuint
    TEXTURE_MAG_FILTERGLenum
    TEXTURE_MAX_LEVELGLint
    TEXTURE_MAX_LODGLfloat
    TEXTURE_MIN_FILTERGLenum
    TEXTURE_MIN_LODGLfloat
    TEXTURE_WRAP_RGLenum
    TEXTURE_WRAP_SGLenum
    TEXTURE_WRAP_TGLenum

    如果pname不在上述表格中,则会生成一个INVALID_ENUM错误。

    如果尝试在没有绑定WebGL纹理的情况下调用此函数(参见上文),则会生成一个INVALID_OPERATION错误。

    如果生成OpenGL错误,则返回null。

2.void texParameterf(GLenum target, GLenum pname, GLfloat param) (OpenGL ES 3.0.6 §3.8.7man page)
  • 根据给定的目标设置传递的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错误。

3.void texParameteri(GLenum target, GLenum pname, GLint param) (OpenGL ES 3.0.6 §3.8.7man page)
  • 根据传递的pname和目标设置值。pname与上面表格中的texParameterf相同。

    如果pname不在上述表格中,会产生一个INVALID_ENUM错误。

    如果尝试在没有绑定WebGLTexture的情况下调用此函数(见上文),会产生一个INVALID_OPERATION错误。

4.void texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §3.8.4man page)
  • 同时指定二维或立方体贴图的所有级别。

    图像内容的设置方式就好像在OpenGL ES 3.0规范的第3.8.4节的伪代码中,每个texImage2D(或用于压缩格式的compressedTexImage2D)调用都会传递一个足够大且初始化为0的缓冲区。

texStorage2D应被视为对texImage2D的首选替代方法。在某些实现中,它可能比texImage2D具有更低的内存成本。

5.[void texStorage3D]()(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) (OpenGL ES 3.0.6 §3.8.4man page)
  • 指定三维纹理或二维数组纹理的所有级别。

    图像内容的设置方式就好像在OpenGL ES 3.0规范的第3.8.4节的伪代码中,每个texImage3D(或用于压缩格式的compressedTexImage3D)调用都会传递一个足够大且初始化为0的缓冲区。

6.undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset) (OpenGL ES 3.0.6 §3.8.3man page)
  • 与WebGL 1.0中的texImage2D相比,唯一的不同之处在于此处描述。

    如果一个WebGLBuffer被绑定到PIXEL_UNPACK_BUFFER目标,将生成一个INVALID_OPERATION错误。

    在WebGL 2.0中支持大小限定的内部格式,internalformat不再需要与format相同。相反,internalformatformattype的组合必须在man page中的表1或表2中列出。

    如果type被指定为FLOAT_32_UNSIGNED_INT_24_8_REV,则srcData必须为null;否则,将生成一个INVALID_OPERATION错误。

    srcData的类型必须与以下表格中的type匹配;否则,将生成一个INVALID_OPERATION错误:

    type of srcDatatype
    Int8ArrayBYTE
    Uint8ArrayUNSIGNED_BYTE
    Uint8ClampedArrayUNSIGNED_BYTE
    Int16ArraySHORT
    Uint16ArrayUNSIGNED_SHORT
    Uint16ArrayUNSIGNED_SHORT_5_6_5
    Uint16ArrayUNSIGNED_SHORT_5_5_5_1
    Uint16ArrayUNSIGNED_SHORT_4_4_4_4
    Int32ArrayINT
    Uint32ArrayUNSIGNED_INT
    Uint32ArrayUNSIGNED_INT_5_9_9_9_REV
    Uint32ArrayUNSIGNED_INT_2_10_10_10_REV
    Uint32ArrayUNSIGNED_INT_10F_11F_11F_REV
    Uint32ArrayUNSIGNED_INT_24_8
    Uint16ArrayHALF_FLOAT
    Float32ArrayFLOAT
  • 如果未满足pixel store parameter constraints,将生成一个INVALID_OPERATION错误。

  • srcData的第srcOffset个元素开始进行读取。(对于Uint8Array,元素是字节;对于Int32Array,元素是32位整数等等。)

  • 如果在从srcDatasrcOffset开始的位置没有足够的数据,将生成一个INVALID_OPERATION错误。

7.[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.3man page)
  • 仅与WebGL 1.0中的texImage2D有所不同的部分在这里进行描述。

    对于在WebGL 2.0中引入的新格式,按照以下表格进行转换。

    Source DOM Image FormatTarget WebGL Format
    REDRG
    Grayscale (1 channel)R = sourceGrayR = sourceGray G = 0
    Grayscale + Alpha (2 channels)R = sourceGrayR = sourceGray G = 0
    Color (3 channels) Color + Alpha (4 channels)R = sourceRedR = sourceRed G = sourceGreen

上传元素的子区域的详细信息可以在TexImageSource上传的像素存储参数中找到。

如果一个WebGLBuffer绑定到PIXEL_UNPACK_BUFFER目标上,会生成一个INVALID_OPERATION错误。

在WebGL 2.0中支持大小化的内部格式,并且不再要求internalformat必须与format相同。相反,internalformatformattype的组合必须在以下表格中列出:

Internal FormatFormatType
RGBRGBUNSIGNED_BYTE UNSIGNED_SHORT_5_6_5
RGBARGBAUNSIGNED_BYTE, UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_5_5_5_1
LUMINANCE_ALPHALUMINANCE_ALPHAUNSIGNED_BYTE
LUMINANCELUMINANCEUNSIGNED_BYTE
ALPHAALPHAUNSIGNED_BYTE
R8REDUNSIGNED_BYTE
R16FREDHALF_FLOAT FLOAT
R32FREDFLOAT
R8UIRED_INTEGERUNSIGNED_BYTE
RG8RGUNSIGNED_BYTE
RG16FRGHALF_FLOAT FLOAT
RG32FRGFLOAT
RG8UIRG_INTEGERUNSIGNED_BYTE
RGB8RGBUNSIGNED_BYTE
SRGB8RGBUNSIGNED_BYTE
RGB565RGBUNSIGNED_BYTE UNSIGNED_SHORT_5_6_5
R11F_G11F_B10FRGBUNSIGNED_INT_10F_11F_11F_REV HALF_FLOAT FLOAT
RGB9_E5RGBHALF_FLOAT FLOAT
RGB16FRGBHALF_FLOAT FLOAT
RGB32FRGBFLOAT
RGB8UIRGB_INTEGERUNSIGNED_BYTE
RGBA8RGBAUNSIGNED_BYTE
SRGB8_ALPHA8RGBAUNSIGNED_BYTE
RGB5_A1RGBAUNSIGNED_BYTE UNSIGNED_SHORT_5_5_5_1
RGB10_A2RGBAUNSIGNED_INT_2_10_10_10_REV
RGBA4RGBAUNSIGNED_BYTE UNSIGNED_SHORT_4_4_4_4
RGBA16FRGBAHALF_FLOAT FLOAT
RGBA32FRGBAFLOAT
RGBA8UIRGBA_INTEGERUNSIGNED_BYTE

当数据源是DOM元素(HTMLImageElementHTMLCanvasElementHTMLVideoElement),或者是ImageBitmapImageDataOffscreenCanvas对象时,通常每个通道的表示都是至少8位的无符号整数类型。将这种表示转换为带有更多位的有符号整数或无符号整数并不清楚定义。例如,将RGBA8转换为RGBA16UI时,不清楚是否意图将值缩放到16位无符号整数的完整范围内。因此,只允许转换为最多8位的无符号整数、半浮点数或浮点数。

7.[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.3man page)
  • 从绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer上传数据到当前绑定的WebGLTexture。

    offset是WebGLBuffer数据存储的字节偏移量;如果小于0,则生成INVALID_VALUE错误。

    formattype和WebGLTexture的内部格式的组合必须在man页面的表1或表2中列出。

    如果尝试在没有绑定WebGLTexture的情况下调用该函数,将生成INVALID_OPERATION错误。

    如果没有将任何WebGLBuffer绑定到PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。

    如果不满足pixel store参数限制,将生成INVALID_OPERATION错误。

8.[undefined texSubImage2D]()(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset) (OpenGL ES 3.0.6 §3.8.5man page)
  • 与WebGL 1.0中的texSubImage2D相比,唯一的区别在这里描述:

    如果绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。

    formattype和WebGLTexture的内部格式的组合必须在man页面的表1或表2中列出。

    srcData的类型必须根据上述表格type匹配,否则将生成INVALID_OPERATION错误。

    请参阅像素存储参数,这些参数会影响此函数的行为。

    如果不满足pixel store参数限制,将生成INVALID_OPERATION错误。

    srcData开始读取的位置是在srcOffset元素处(对于Uint8Array是字节,对于Int32Array是int32等)。

    如果从srcOffset开始的srcData中没有足够的数据,将生成INVALID_OPERATION错误。

9.[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.5man page)
  • 与WebGL 1.0中的texSubImage2D相比,唯一的区别在这里描述:

    上传元素的子区域在TexImageSource上传的像素存储参数中有详细说明。

    如果绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。

    formattype和WebGLTexture的内部格式的组合必须在这个表格中列出。

10.[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.5man page)
  • 从绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer更新当前绑定的WebGLTexture的子矩形,使用来自WebGLBuffer的数据。

    offset是进入WebGLBuffer数据存储的字节偏移量;如果小于0,将生成INVALID_VALUE错误。

    如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成INVALID_OPERATION错误。

    如果没有绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。

    如果不满足像素存储参数约束,将生成INVALID_OPERATION错误。

11.void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData)
12. void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset) (OpenGL ES 3.0.6 §3.8.3man page)
  • 为三维或二维数组纹理分配并初始化指定的mipmap级别。

    • 如果绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。

    • 如果srcData为空,将传递一个足够大小且初始化为0的缓冲区。

    • internalformatformattype的组合必须在man页面的表1或表2中列出。

    • 如果type指定为FLOAT_32_UNSIGNED_INT_24_8_REV,则srcData必须为null;否则,将生成INVALID_OPERATION错误。

    • 如果srcData非空,则其类型必须根据上述表匹配type;否则,将生成INVALID_OPERATION错误。

    • 如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成INVALID_OPERATION错误。

    • 有关影响此函数行为的WebGL特定像素存储参数,请参阅像素存储参数

    • 如果不满足像素存储参数约束,将生成INVALID_OPERATION错误。

    • srcData开始读取从srcOffset元素开始。(对于Uint8Array是字节,对于Int32Array是int32等)

    • 如果从srcDatasrcOffset开始没有足够的数据,将生成INVALID_OPERATION错误。

    • 建议使用texStorage3D来代替texImage3D分配三维纹理。在某些实现中,与texStorage3D相比,texImage3D可能会产生更高的内存成本。

13.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.3man page)
  • 更新当前绑定的WebGLTexture的矩形子区域。

    有关上传元素的子区域的详细信息,请参阅从TexImageSource上传的像素存储参数

    有关formattype参数的解释,请参见texImage2D,以及关于UNPACK_PREMULTIPLY_ALPHA_WEBGL像素存储参数的说明。

    有关影响调用此函数时以除ImageBitmap外的任何参数类型调用时的行为的WebGL特定像素存储参数,请参阅像素存储参数

    从源传输到WebGL实现的第一个像素对应于源的左上角。这个行为可以通过UNPACK_FLIP_Y_WEBGL像素存储参数进行修改,除了ImageBitmap参数,如上述部分所述。

    formattype和WebGLTexture的内部格式的组合必须在此表中列出。

    如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成INVALID_OPERATION错误。

    如果绑定到PIXEL_UNPACK_BUFFER目标的是WebGLBuffer,则会生成INVALID_OPERATION错误。

    如果使用一个被中和的ImageData调用此函数,将生成INVALID_VALUE错误。

    如果使用一个被中和的ImageBitmap调用此函数,将生成INVALID_VALUE错误。

    如果使用源与包含文档的源不同的HTMLImageElementHTMLVideoElement,或者使用设置了*origin-clean*标志为false的HTMLCanvasElementImageBitmapOffscreenCanvas,则必须抛出SECURITY_ERR异常。请参阅源限制

14.[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.3man page)
  • 将数据从绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer上传到当前绑定的WebGLTexture中。

    offset是字节偏移量,指向WebGLBuffer的数据存储区;如果它小于0,则生成INVALID_VALUE错误。

    如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成INVALID_OPERATION错误。

    如果没有将WebGLBuffer绑定到PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。

    如果不满足pixel store参数约束,将生成INVALID_OPERATION错误。

15.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 GLuint srcOffset = 0) (OpenGL ES 3.0.6 §3.8.5man page)
  • 更新当前绑定的WebGLTexture的矩形子区域。

    如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成INVALID_OPERATION错误。

    如果将WebGLBuffer绑定到PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。

    formattype和WebGLTexture的内部格式的组合必须列在man页面的表1或表2中。

    如果typeFLOAT_32_UNSIGNED_INT_24_8_REV,将生成INVALID_ENUM错误。

    srcData的类型必须与上述表格中的type匹配;否则,将生成INVALID_OPERATION错误。

    如果srcData非空但其大小小于所需的widthheightdepthformattype和像素存储参数,则将生成INVALID_OPERATION错误。

    有关影响此函数行为的WebGL特定像素存储参数,请参见像素存储参数

    如果不满足pixel store参数约束,将生成INVALID_OPERATION错误。

    srcData开始读取的位置为从srcOffset开始的元素(对于Uint8Array来说是字节,对于Int32Array来说是int32)。

    如果在srcData中从srcOffset开始没有足够的数据,将生成INVALID_OPERATION错误。

16.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.5man page)
  • 更新当前绑定的WebGLTexture的矩形子区域。

    关于上传元素的子区域的详细信息,请参阅从TexImageSource上传的像素存储参数

    关于formattype参数的解释以及关于UNPACK_PREMULTIPLY_ALPHA_WEBGL像素存储参数的注释,请参见texImage2D

    有关调用此函数时调用参数类型为ImageBitmap以外的情况下影响函数行为的WebGL特定像素存储参数,请参见像素存储参数

    从源传输到WebGL实现的第一个像素对应于源的左上角。这种行为由UNPACK_FLIP_Y_WEBGL像素存储参数修改,除了ImageBitmap参数之外,正如上面所述的部分所述。

    formattype和WebGLTexture的内部格式的组合必须列在此表格中。

    如果尝试在没有绑定WebGLTexture的情况下调用此函数(请参见上文),将生成INVALID_OPERATION错误。

    如果将WebGLBuffer绑定到PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。

    如果使用已中和的ImageData调用此函数,将生成INVALID_VALUE错误。

    如果使用已中和的ImageBitmap调用此函数,将生成INVALID_VALUE错误。

    如果使用的HTMLImageElementHTMLVideoElement的源与包含文档的源不同,或者使用的HTMLCanvasElementImageBitmapOffscreenCanvas的位图的origin-clean标志设置为false,将抛出SECURITY_ERR异常。请参阅源限制

17.[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.5man page)
  • 使用来自绑定到PIXEL_UNPACK_BUFFER目标的WebGLBuffer的数据更新当前绑定的WebGLTexture的子矩形。

    offset是进入WebGLBuffer数据存储的字节偏移量;如果小于0,则会生成INVALID_VALUE错误。

    如果尝试在没有绑定WebGLTexture的情况下调用该函数,则会生成INVALID_OPERATION错误。

    如果没有将WebGLBuffer绑定到PIXEL_UNPACK_BUFFER目标,则会生成INVALID_OPERATION错误。

    如果未满足像素存储参数约束,则会生成INVALID_OPERATION错误。

18.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.5man page)
  • 这是一个[读取操作]。如果尝试在未绑定WebGL纹理的情况下调用此函数(请参见上文),将会生成一个INVALID_OPERATION错误。

    对于位于帧缓冲区之外的任何像素,对应的目标像素将保持不变;详见在帧缓冲区之外读取像素

    如果此函数尝试从完整帧缓冲区的缺失附件中读取数据,将会生成一个INVALID_OPERATION错误,参考从缺失附件中读取数据

19. undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6man page)
  • srcData中读取数据开始于srcOffset元素位置(对于Uint8Array为字节,对于Int32Array为int32等)。

    如果srcOffset > srcData.length,将生成INVALID_VALUE错误。

    srcLengthOverride默认为srcData.length - srcOffset

    如果在srcData中从srcOffset开始的数据量不足,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,则会生成INVALID_VALUE错误。

20.undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6man page)
  • srcData中读取数据开始于srcOffset元素位置(对于Uint8Array,元素为字节;对于Int32Array等类型,元素为int32等)。

    如果srcOffset > srcData.length,将生成INVALID_VALUE错误。

    srcLengthOverride默认为srcData.length - srcOffset

    如果在srcData中从srcOffset开始的数据量不足,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,将生成INVALID_VALUE错误。

21.undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6man page)
  • srcData中读取数据,从srcOffset元素开始(对于Uint8Array,元素是字节;对于Int32Array等类型,元素是int32等)。

    如果srcOffset大于srcData.length,将生成INVALID_VALUE错误。

    srcLengthOverride默认为srcData.length - srcOffset

    如果从srcOffset开始的srcData中没有足够的数据,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,将生成INVALID_VALUE错误。

22.undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6man page)
  • srcData中读取数据,从srcOffset元素开始(对于Uint8Array,元素是字节;对于Int32Array等类型,元素是int32等)。

    如果srcOffset大于srcData.length,将生成INVALID_VALUE错误。

    srcLengthOverride默认为srcData.length - srcOffset

    如果从srcOffset开始的srcData中没有足够的数据,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,将生成INVALID_VALUE错误。

此部分适用于上述四个入口点。

  • 如果尝试在没有绑定WebGL纹理的情况下调用这些函数(见上文),将生成INVALID_OPERATION错误。

    如果绑定了一个WebGLBuffer到PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。

    在OpenGL ES 3.0中定义的ETC2和EAC纹理格式在WebGL 2.0中不可用

23.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.6man page)
24.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.6man page)
25.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.6man page)
26.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.6man page)

此部分适用于上述四个入口点。

  • 如果尝试在没有绑定WebGL纹理的情况下调用这些函数(见上文),将生成INVALID_OPERATION错误。

    如果没有绑定WebGLBuffer到PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。

    offset是进入WebGLBuffer数据存储的字节偏移量;如果小于0,将生成INVALID_VALUE错误。

    在OpenGL ES 3.0中定义的ETC2和EAC纹理格式在WebGL 2.0中不可用