WebGL

Khronos

WebGL 2.0 规范

编辑者草案 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 规范的 2.0 版。

本规范描述了 HTML 5 canvas 元素 [CANVAS] 的一个额外渲染上下文及支持对象。 此上下文允许使用与 OpenGL ES 3.0 API 紧密一致的 API 进行渲染。

本文档应作为 WebGL 1.0 规范的扩展来阅读。它只会描述与 1.0 的差异。

本文档状态

本文档是编辑者草案。除作为进行中的工作外,请勿引用本文档。

反馈

欢迎在 [email protected] 邮件列表上公开讨论本规范 (说明归档)。

请在 issue tracker 中提交规范或其一致性测试的错误。也欢迎向 Github 仓库提交 Pull requests。

目录

简介

WebGL™ 是为 Web 设计的即时模式 3D 渲染 API。这是 WebGL 规范的第 2 版。 它派生自 OpenGL® ES 3.0,并提供类似的渲染功能, 但位于 HTML 上下文中。

WebGL 2.0 并不完全向后兼容 WebGL 1.0。现有的、针对核心 WebGL 1.0 规范且不使用扩展编写的无错误内容,通常无需修改即可在 WebGL 2.0 中运行, 但情况并不总是如此。所有向后兼容性的例外都记录在 向后不兼容性一节中。 要访问本规范提供的新行为,内容需要显式请求一个新的上下文 (详见下文)。

约定

本文档中描述的许多函数都包含到 OpenGL ES 手册页的链接。尽管已尽一切努力使这些页面与 OpenGL ES 3.0 规范 [GLES30] 匹配, 它们仍可能包含错误。如果存在矛盾,则以 OpenGL ES 3.0 规范为最终权威。

本文档的其余各节旨在与 OpenGL ES 3.0 规范(本文撰写时为 3.0.6, 可从 Khronos OpenGL ES API Registry 获取) 一起阅读。除非另有说明,每个方法的行为由 OpenGL ES 3.0 规范定义。为确保互操作性或安全性,本规范可能偏离 OpenGL ES 3.0,通常会定义 OpenGL ES 3.0 留给实现定义的区域。 这些差异汇总在 WebGL 与 OpenGL ES 3.0 之间的差异一节中。

WebGL 2.0 中移入核心的扩展功能

以下 WebGL 1.0 扩展反映了 WebGL 2.0 中的核心功能,因此在 WebGL 2.0 中不再是 扩展:

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

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

上下文创建

每个 WebGLRenderingContextWebGL2RenderingContext 都有关联的 canvas,在创建时设置, 它是一个 canvas [CANVAS]offscreen canvas [OFFSCREENCANVAS]

每个 WebGLRenderingContextWebGL2RenderingContext 都有在创建时设置的 context creation parameters,位于一个 WebGLContextAttributes 对象中。

每个 WebGLRenderingContextWebGL2RenderingContext 都有 actual context parameters,每次创建绘图缓冲区时设置,位于一个 WebGLContextAttributes 对象中。

每个 WebGLRenderingContextWebGL2RenderingContext 都有一个初始未设置的 webgl context lost flag

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

  1. 创建一个新的 WebGL2RenderingContext 对象,context
  2. contextcanvas 为 与 getContext() 方法关联的 canvas 或 offscreen canvas。
  3. 创建一个新的 WebGLContextAttributes 对象, contextAttributes
  4. 如果 getContext() 以第二个实参 options 调用, 则从 options 中指定的属性设置 contextAttributes 的属性。
  5. 使用 contextAttributes 中指定的设置 创建一个 drawing buffer, 并将该 drawing buffercontext 关联。
  6. 如果 drawing buffer 创建失败,则执行以下步骤:
    1. canvas触发 WebGL context creation error
    2. 返回 null 并终止这些步骤。
  7. 创建一个新的 WebGLContextAttributes 对象, actualAttributes
  8. 根据新创建的 drawing buffer 的属性设置 actualAttributes 的属性。
  9. contextcontext creation parameters 设置为 contextAttributes
  10. contextactual context parameters 设置为 actualAttributes
  11. 返回 context

绘图缓冲区

与 WebGL 1.0 不同,WebGL 2.0 中的 depthstencilantialias 属性必须由 WebGL 实现遵守。

DOM 接口

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

类型

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, 手册 页) , 其激活就像调用 glBeginQuery 一样 (OpenGL ES 3.0.6 §2.14, 手册 页) , 其结束就像调用 glEndQuery 一样 (OpenGL ES 3.0.6 §2.14, 手册 页) 并且其销毁就像调用 glDeleteQueries 一样 (OpenGL ES 3.0.6 §2.14, 手册 页)

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

WebGLSampler

WebGLSampler 接口表示一个 OpenGL Sampler Object。 底层对象的创建就像调用 glGenSamplers 一样 (OpenGL ES 3.0.6 §3.8.2, 手册 页) , 其绑定就像调用 glBindSampler 一样 (OpenGL ES 3.0.6 §3.8.2, 手册 页) 并且其销毁就像调用 glDeleteSamplers 一样 (OpenGL ES 3.0.6 §3.8.2, 手册页)

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

WebGLSync

WebGLSync 接口表示一个 OpenGL Sync Object。 底层对象的创建就像调用 glFenceSync 一样 (OpenGL ES 3.0.6 §5.2, 手册 页) , 其阻塞就像调用 glClientWaitSync 一样 (OpenGL ES 3.0.6 §5.2.1, 手册页) , 其在 GL 内部等待就像调用 glWaitSync 一样 (OpenGL ES 3.0.6 §5.2.1, 手册 页) , 其查询就像调用 glGetSynciv 一样 (OpenGL ES 3.0.6 §6.1.8, 手册 页) , 并且其销毁就像调用 glDeleteSync 一样 (OpenGL ES 3.0.6 §5.2, 手册 页)

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

WebGLTransformFeedback

WebGLTransformFeedback 接口表示一个 OpenGL Transform Feedback Object。 底层对象的创建就像调用 glGenTransformFeedbacks 一样 (OpenGL ES 3.0.6 §2.15.1, 手册页) , 其绑定就像调用 glBindTransformFeedback 一样 (OpenGL ES 3.0.6 §2.15.1, 手册页) 并且其销毁就像调用 glDeleteTransformFeedbacks 一样 (OpenGL ES 3.0.6 §2.15.1, 手册 页)

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

WebGLVertexArrayObject

WebGLVertexArrayObject 接口表示一个 OpenGL Vertex Array Object。 底层对象的创建就像调用 glGenVertexArrays 一样 (OpenGL ES 3.0.6 §2.10, 手册页) , 其绑定就像调用 glBindVertexArray 一样 (OpenGL ES 3.0.6 §2.10, 手册页) 并且其销毁就像调用 glDeleteVertexArrays 一样 (OpenGL ES 3.0.6 §2.10, 手册页)

[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;

更多绑定点

void bindBuffer(GLenum target, WebGLBuffer? buffer) (OpenGL ES 3.0.6 §2.10.1, 手册 页)
将给定的 WebGLBuffer 对象绑定到给定的绑定点(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 绑定限制。
void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer) (OpenGL ES 3.0.6 §4.4.1, 手册页)
将给定的 WebGLFramebuffer 对象绑定到给定的绑定点(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, 手册页)
将给定的 WebGLTexture 对象绑定到给定的绑定点(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 手册页, glGetString OpenGL ES 3.0 手册页)
返回传入 pname 的值。除了支持来自 WebGL 1.0 的所有 pname/type 值之外,还支持以下参数:
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?

所有返回序列或 typed arrays 的查询每次都返回一个新对象。

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

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

VERSION 返回形如 WebGL<space>2.0<optional><space><vendor-specific information></optional> 的版本或发布编号。
SHADING_LANGUAGE_VERSION 返回形如 WebGL<space>GLSL<space>ES<space>3.00<optional><space><vendor-specific information></optional> 的版本或发布编号。

对于 RED_BITSGREEN_BITSBLUE_BITSALPHA_BITS, 如果 draw framebuffer 的活动颜色附件不具有相同格式,则生成 INVALID_OPERATION 错误并返回 0。

any getIndexedParameter(GLenum target, GLuint index) (OpenGL ES 3.0.6 §6.1.1, glGet OpenGL ES 3.0 手册页)
返回传入 target 的索引值。返回的类型是所请求 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 超出索引状态 target 的有效范围,则生成 INVALID_VALUE 错误。

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

GLboolean isEnabled(GLenum cap) (OpenGL ES 3.0.6 §6.1.1, OpenGL ES 3.0 手册 页)
除 WebGL 1.0 中所有 cap 值之外,还支持 RASTERIZER_DISCARD。
void pixelStorei(GLenum pname, GLint param) (OpenGL ES 3.0.6 §3.7.1, OpenGL ES 3.0 手册 页)
除 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

Buffer 对象

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, 手册 页)
设置当前绑定的 WebGLBuffer 对象的大小,然后将 srcData 的一个子区域复制到 buffer 对象。

buf 为绑定到 target 的 buffer。

如果 length 为 0: 否则,令 copyLengthlength

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

如果 srcDataDataView,令 elementSize 为 1;否则,令 elementSizesrcData.BYTES_PER_ELEMENT

如果 copyLength 大于零,则从 srcData 复制 copyLength 个 typed elements (每个大小为 elementSize)到 buf 中, 从元素索引 srcOffset 开始读取 srcData。 如果 copyLength 为 0,则不向 buf 写入数据,但这不会 导致生成 GL 错误。 如果生成任何错误,则 buf 的大小不变,并且不会向其写入任何数据。
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, 手册页)
srcData 的一个子区域复制到当前绑定的 WebGLBuffer 对象。

buf 为绑定到 target 的 buffer。

如果 length 为 0: 否则,令 copyLengthlength

如果 srcDataDataView,令 copyByteLengthcopyLength;否则,令 copyByteLengthcopyLength * srcData.BYTES_PER_ELEMENT

如果 srcDataDataView,令 elementSize 为 1;否则,令 elementSizesrcData.BYTES_PER_ELEMENT

如果 copyLength 大于零,则从 srcData 复制 copyLength 个 typed elements (每个大小为 elementSize)到 buf 中, 从元素索引 srcOffset 开始读取 srcData,并 从字节偏移 dstByteOffset 开始写入 buf。 如果 copyLength 为 0,则不向 buf 写入数据,但这不会 导致生成 GL 错误。 如果生成任何错误,则不会向 buf 写入任何数据。
any getBufferParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.9, 手册页)
返回传入 pname 的值。除了像 WebGL 1.0 中一样支持使用 pname BUFFER_USAGE 进行查询外, 使用 pname BUFFER_SIZE 查询会返回类型为 GLsizeiptr 的 buffer 大小值。

void copyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) (OpenGL ES 3.0.6 §2.10.5, 手册页)

将绑定到 readTarget 的 buffer 中的部分数据复制到绑定到 writeTarget 的 buffer。 有关 WebGL 2.0 API 施加的限制,参见 复制 Buffer

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

从绑定的 WebGLBuffer 读回数据到 dstBuffer 中。

buf 为绑定到 target 的 buffer。

如果 length 为 0: 否则,令 copyLengthlength

如果 dstBufferDataView,令 copyByteLengthcopyLength;否则,令 copyByteLengthcopyLength * dstBuffer.BYTES_PER_ELEMENT

如果 dstBufferDataView,令 elementSize 为 1;否则,令 elementSizedstBuffer.BYTES_PER_ELEMENT

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

如果该 buffer 由其他操作和 getBufferSubData 顺序写入和读取, WebGL API 负责确保数据被一致地访问。即使该 buffer 当前绑定到 transform feedback 绑定点,这也适用。

这是一个阻塞操作,因为 WebGL 必须完全完成所有 先前对源 buffer 的写入,才能返回结果。 在多进程 WebGL 实现中,getBufferSubData 还可能产生一次昂贵的跨进程往返,以从远程进程获取 结果。

用户可以通过表明从 buffer 读回的意图来避免这些成本:

  • 在写入源 buffer 后插入一个 fenceSync, 并等待其通过,然后再执行 getBufferSubData 操作。
  • 如果 buffer 要用作读回源,则使用 _READ usage hint 分配 buffer。(避免过度使用以 _READ usage hint 分配的 buffer,因为它们可能因维护 buffer 数据的影子副本而产生 开销。)

Framebuffer 对象

[WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target) (OpenGL ES 3.0.6 §4.4.4.2, 手册 页)

这里只描述与 WebGL 1.0 中 checkFramebufferStatus 的差异。

target 必须为 DRAW_FRAMEBUFFERREAD_FRAMEBUFFERFRAMEBUFFERFRAMEBUFFER 等价于 DRAW_FRAMEBUFFER

如果 depth 和 stencil 附件存在但不是同一图像,则返回 FRAMEBUFFER_UNSUPPORTED。详细讨论见 Framebuffer Object 附件

如果附加的 renderbuffer 之间的 RENDERBUFFER_SAMPLES 值不同,或者当附加图像混合了 renderbuffer 和 texture 时这些值非零,则返回 FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

如果附加图像具有不同的宽度、高度, 以及深度(对于 3D 纹理)或数组大小(对于 2D 数组纹理),则返回 FRAMEBUFFER_INCOMPLETE_DIMENSIONS。参见 checkFramebufferStatus 可能返回 FRAMEBUFFER_INCOMPLETE_DIMENSIONS

如果同一图像被附加到多个颜色附件点,则返回 FRAMEBUFFER_UNSUPPORTED。参见 Framebuffer 颜色附件

any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname) (OpenGL ES 3.0.6 §6.1.13, 类似于 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 或 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 且不同图像被附加到 depth 和 stencil 附件点,则生成 INVALID_OPERATION 错误。详细讨论见 Framebuffer Object 附件

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, 手册页)

同时是一个 [读取操作] 和一个 [绘制操作]
将像素值矩形从 read framebuffer 的一个区域传输到 draw framebuffer 中的另一区域。如果 read framebuffer 的 SAMPLE_BUFFERS 值为一, 而 draw framebuffer 的 SAMPLE_BUFFERS 值为零,则源中对应每个像素位置的样本 会在写入目标之前转换为单个样本。

任何其中心对应于源 buffer 外部点的目标像素保持 不变。

当 blit 到 WebGL 上下文默认 back buffer 的颜色附件时,以 alpha:false 创建的上下文被视为具有内部 格式 RGB8,而以 alpha:true 创建的上下文被视为 具有内部格式 RGBA8

如果此函数尝试 blit 到完整 framebuffer 的缺失附件,则不会向该附件 blit 任何内容,也不会生成错误, 依照 绘制到缺失附件
如果此函数尝试从完整 framebuffer 的缺失附件读取,并且至少一个 draw buffer 有要被 blit 的图像,则生成 INVALID_OPERATION 错误, 依照 从缺失附件读取

void framebufferTextureLayer(GLenum target, GLenum attachment, WebGLTexture? texture, GLint level, GLint layer) (OpenGL ES 3.0.6 §4.4.2.4, 手册页)

如果 texture 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

void invalidateFramebuffer(GLenum target, sequence<GLenum> attachments) (OpenGL ES 3.0.6 §4.5, 手册页)

一个 [绘制操作]
等价于调用 invalidateSubFramebuffer,其中 xy 设置为 0,widthheight 设置为最大 framebuffer 对象的 附件宽度和高度。

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

一个 [绘制操作]
向 GL 发出信号,表示它无需保留已绑定 framebuffer 对象的全部内容。

void readBuffer(GLenum src) (OpenGL ES 3.0.6 §4.3.1, 手册页)

指定 read framebuffer 的一个 color buffer 作为 read buffer。

Renderbuffer 对象

any getInternalformatParameter(GLenum target, GLenum internalformat, GLenum pname) (OpenGL ES 3.0.6 §6.1.15, 手册页)

在给定传入 target 和 internalformat 的情况下,返回传入 pname 的值。返回的类型 如下表所示:
pname 返回类型
SAMPLES Int32Array

如果 pname 不在上表中,则生成 INVALID_ENUM 错误。

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

每个对 SAMPLES 的查询都返回一个新的 typed array 对象实例。

any getRenderbufferParameter(GLenum target, GLenum pname) (OpenGL ES 2.0 §6.1.14, 类似于 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, 手册页)

接受 OpenGL ES 3.0 中的 internal format,详见规范手册页

为向后兼容 WebGL 1,也接受 internal format DEPTH_STENCIL, 实现应将其映射到 DEPTH24_STENCIL8

void renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.4.2.1, 手册页)

当 `internalFormat == DEPTH_STENCIL && samples > 0` 时生成 INVALID_OPERATION

Texture 对象

Texture 对象为纹理操作提供存储和状态。如果没有绑定 WebGLTexture (例如,向 bindTexture 传递 null 或 0),则尝试修改或查询 texture 对象应 生成 INVALID_OPERATION 错误。下面的函数会在 OpenGL ES 3.0 规范允许函数更改默认纹理的情况下指出这一点。

any getTexParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.3, 手册页)
在给定传入 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, 手册页)
在给定传入 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, 手册页)

在给定传入 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, 手册页)

同时指定二维或 cube-map 纹理的所有层级。

图像内容会被设置为,就像在 OpenGL ES 3.0 规范第 3.8.4 节 (OpenGL ES 3.0.6 §3.8.4) 伪代码中的每次 texImage2D(或用于压缩格式的 compressedTexImage2D)调用中, 都传入一个足够大小且初始化为 0 的 buffer 一样。
texStorage2D 应被视为 texImage2D 的首选替代方案。在某些实现中,它的内存成本可能低于 texImage2D

void texStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) (OpenGL ES 3.0.6 §3.8.4, 手册页)

指定三维纹理或二维数组纹理的所有层级。

图像内容会被设置为,就像在 OpenGL ES 3.0 规范第 3.8.4 节 (OpenGL ES 3.0.6 §3.8.4) 伪代码中的每次 texImage3D(或用于压缩格式的 compressedTexImage3D)调用中, 都传入一个足够大小且初始化为 0 的 buffer 一样。
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, 手册页)

这里只描述与 WebGL 1.0 中 texImage2D 的差异。

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

WebGL 2.0 支持 sized internal formats,且 internalformat 不再要求与 format 相同。相反,internalformatformattype 的组合必须列在 手册 页中的表 1 或表 2 中。

如果 type 被指定为 FLOAT_32_UNSIGNED_INT_24_8_REVsrcData 必须为 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 约束, 则生成 INVALID_OPERATION 错误。

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

如果从 srcOffset 开始的 srcData 中没有足够数据, 则生成 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, 手册页)

这里只描述与 WebGL 1.0 中 texImage2D 的差异。

对 WebGL 2.0 中引入的新格式的转换按下表执行。

源 DOM 图像格式 目标 WebGL 格式
RED RG
灰度(1 通道) R = sourceGray
R = sourceGray
G = 0
灰度 + Alpha(2 通道) R = sourceGray
R = sourceGray
G = 0
颜色(3 通道)
颜色 + Alpha(4 通道)
R = sourceRed
R = sourceRed
G = sourceGreen

元素子区域的上传在 用于从 TexImageSource 上传的 Pixel store 参数中详细说明。

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

WebGL 2.0 支持 sized internal formats,且 internalformat 不再要求与 format 相同。相反,internalformatformattype 的组合必须列在下表中:

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
当数据源是 DOM 元素(HTMLImageElementHTMLCanvasElementHTMLVideoElement),或是 ImageBitmapImageDataOffscreenCanvas 对象时,通常每个通道的表示都是至少 8 位的无符号整数类型。将这种表示转换为有符号整数 或更多位数的无符号整数并没有明确定义。例如,当将 RGBA8 转换为 RGBA16UI 时, 其意图是否是将值放大到 16 位无符号整数的完整范围并不明确。 因此,只允许转换为最多 8 位的无符号整数、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, 手册页)

从绑定到 PIXEL_UNPACK_BUFFER target 的 WebGLBuffer 向当前绑定的 WebGLTexture 上传数据。

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

formattype 和 WebGLTexture 的 internal format 的组合必须列在 手册 页中的表 1 或表 2 中。

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

如果没有 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果不满足 pixel store parameter 约束, 则生成 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, 手册页)

这里只描述与 WebGL 1.0 中 texSubImage2D 的差异。

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

formattype 和 WebGLTexture 的 internal format 的组合必须列在 手册 页中的表 1 或表 2 中。

srcData 的类型必须按上表type 匹配; 否则,生成 INVALID_OPERATION 错误。

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

如果不满足 pixel store parameter 约束, 则生成 INVALID_OPERATION 错误。

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

如果从 srcOffset 开始的 srcData 中没有足够数据, 则生成 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, 手册页)

这里只描述与 WebGL 1.0 中 texSubImage2D 的差异。

元素子区域的上传在 用于从 TexImageSource 上传的 Pixel store 参数中详细说明。

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

formattype 和 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, 手册页)

使用来自绑定到 PIXEL_UNPACK_BUFFER target 的 WebGLBuffer 的数据, 更新当前绑定 WebGLTexture 的子矩形。

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

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

如果没有 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果不满足 pixel store parameter 约束, 则生成 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, 手册页)

分配并初始化三维或二维数组纹理的指定 mipmap 层级。

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果 srcData 为 null,则传入一个足够大小且初始化为 0 的 buffer。

internalformatformattype 的组合必须列在 手册 页中的表 1 或表 2 中。

如果 type 被指定为 FLOAT_32_UNSIGNED_INT_24_8_REVsrcData 必须为 null;否则,生成 INVALID_OPERATION 错误。

如果 srcData 非 null,则 srcData 的类型必须按 上表type 匹配; 否则,生成 INVALID_OPERATION 错误。

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

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

如果不满足 pixel store parameter 约束, 则生成 INVALID_OPERATION 错误。

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

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

建议使用 texStorage3D 而不是 texImage3D 来分配三维纹理。在某些实现中,与 texStorage3D 相比,texImage3D 可能会带来更高的内存成本。

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, 手册页)

更新当前绑定的 WebGLTexture 的矩形子区域。

元素子区域的上传在 用于从 TexImageSource 上传的 Pixel store 参数中详细说明。

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

有关当此函数以 ImageBitmap 之外的任何实参类型调用时 影响其行为的 WebGL 特定像素存储参数, 参见 Pixel Storage Parameters

从源传输到 WebGL 实现的第一个像素对应于源的左上角。 此行为会被 UNPACK_FLIP_Y_WEBGL pixel storage parameter 修改, 但 ImageBitmap 实参除外,如上述章节所述。

formattype 和 WebGLTexture 的 internal format 的组合必须列在 此表中。

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

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果此函数以其 data 属性已被 neutered 的 ImageData 调用,则生成 INVALID_VALUE 错误。

如果此函数以已被 neutered 的 ImageBitmap 调用, 则生成 INVALID_VALUE 错误。

如果此函数以其来源不同于包含 Document 的来源的 HTMLImageElementHTMLVideoElement 调用, 或以其位图的 origin-clean 标志设置为 false 的 HTMLCanvasElementImageBitmapOffscreenCanvas 调用,则必须抛出 SECURITY_ERR 异常。参见 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, 手册页)

从绑定到 PIXEL_UNPACK_BUFFER target 的 WebGLBuffer 向当前绑定的 WebGLTexture 上传数据。

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

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

如果没有 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果不满足 pixel store parameter 约束, 则生成 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, 手册页)

更新当前绑定的 WebGLTexture 的矩形子区域。

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

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

formattype 和 WebGLTexture 的 internal format 的组合必须列在 手册 页中的表 1 或表 2 中。

如果 typeFLOAT_32_UNSIGNED_INT_24_8_REV,则生成 INVALID_ENUM 错误。

srcData 的类型必须按上表type 匹配; 否则,生成 INVALID_OPERATION 错误。

如果 srcData 非 null,但其大小小于由指定的 widthheightdepthformattype 和像素存储参数所要求的大小,则生成 INVALID_OPERATION 错误。

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

如果不满足 pixel store parameter 约束, 则生成 INVALID_OPERATION 错误。

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

如果从 srcOffset 开始的 srcData 中没有足够数据, 则生成 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, 手册页)

更新当前绑定的 WebGLTexture 的矩形子区域。

元素子区域的上传在 用于从 TexImageSource 上传的 Pixel store 参数中详细说明。

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

有关当此函数以 ImageBitmap 之外的任何实参类型调用时 影响其行为的 WebGL 特定像素存储参数,参见 Pixel Storage Parameters

从源传输到 WebGL 实现的第一个像素对应于源的左上角。 此行为会被 UNPACK_FLIP_Y_WEBGL pixel storage parameter 修改, 但 ImageBitmap 实参除外,如上述章节所述。

formattype 和 WebGLTexture 的 internal format 的组合必须列在 此表中。

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

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果此函数以其 data 属性已被 neutered 的 ImageData 调用,则生成 INVALID_VALUE 错误。

如果此函数以已被 neutered 的 ImageBitmap 调用, 则生成 INVALID_VALUE 错误。

如果此函数以其来源不同于包含 Document 的来源的 HTMLImageElementHTMLVideoElement 调用, 或以其位图的 origin-clean 标志设置为 false 的 HTMLCanvasElementImageBitmapOffscreenCanvas 调用,则必须抛出 SECURITY_ERR 异常。参见 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, 手册页)

使用来自绑定到 PIXEL_UNPACK_BUFFER target 的 WebGLBuffer 的数据, 更新当前绑定 WebGLTexture 的子矩形。

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

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

如果没有 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果不满足 pixel store parameter 约束, 则生成 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, 手册页)

一个 [读取操作]
如果尝试在没有绑定 WebGLTexture 的情况下调用此函数(见上文),则生成 INVALID_OPERATION 错误。

对于位于 framebuffer 之外的任何像素,对应的目标像素保持 不变;参见 读取 Framebuffer 之外的像素

如果此函数尝试从完整 framebuffer 的缺失附件读取, 则生成 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, 手册页)

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

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

srcLengthOverride 默认为 srcData.length - srcOffset

如果从 srcOffset 开始的 srcData 中没有足够数据,或者 传入的数据量与压缩图像的格式、尺寸和 内容不一致,则生成 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, 手册页)

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

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

srcLengthOverride 默认为 srcData.length - srcOffset

如果从 srcOffset 开始的 srcData 中没有足够数据,或者 传入的数据量与压缩图像的格式、尺寸和 内容不一致,则生成 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, 手册页)

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

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

srcLengthOverride 默认为 srcData.length - srcOffset

如果从 srcOffset 开始的 srcData 中没有足够数据,或者 传入的数据量与压缩图像的格式、尺寸和 内容不一致,则生成 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, 手册页)

srcData 读取时,从 srcData 中的 srcOffset 个元素之后开始。(对于 Uint8Array,元素是字节;对于 Int32Array,是 int32,依此类推。)

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

srcLengthOverride 默认为 srcData.length - srcOffset

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

本节适用于上述四个入口点。

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

如果 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

OpenGL ES 3.0 中定义的 ETC2 和 EAC 纹理格式 在 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, 手册页)

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, 手册页)

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, 手册页)

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, 手册页)

本节适用于上述四个入口点。

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

如果没有 WebGLBuffer 绑定到 PIXEL_UNPACK_BUFFER target,则生成 INVALID_OPERATION 错误。

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

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

Program 和 Shader

[WebGLHandlesContextLoss] GLint getFragDataLocation(WebGLProgram program, DOMString name) (OpenGL ES 3.0.6 §3.9.2.3, 手册页)

如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误并返回 -1。
any getProgramParameter(WebGLProgram? program, GLenum pname) (OpenGL ES 3.0.6 §6.1.12, 手册页)
如果 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。

Uniform 和 attribute

any getUniform(WebGLProgram program, WebGLUniformLocation location) (OpenGL ES 3.0.6 §6.1.12, 手册 页)
如果 programlocation 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

返回传入 program 中传入 location 处的 uniform 值。返回的类型取决于 uniform 类型。WebGL 2.0 中新增 uniform 类型的返回类型如下表所示:
uniform 类型 返回类型
uint GLuint
uvec2 Uint32Array(含 2 个元素)
uvec3 Uint32Array(含 3 个元素)
uvec4 Uint32Array(含 4 个元素)
mat2x3 Float32Array(含 6 个元素)
mat2x4 Float32Array(含 8 个元素)
mat3x2 Float32Array(含 6 个元素)
mat3x4 Float32Array(含 12 个元素)
mat4x2 Float32Array(含 8 个元素)
mat4x3 Float32Array(含 12 个元素)
任意 sampler 类型 GLint

与 WebGL 1.0 共享的 uniform 类型,其返回类型与 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, 手册页)

上述每个 uniform* 函数都会将指定的一个或多个 uniform 设置为所提供的 值。如果传入的 location 不为 null,且不是通过先前对 getUniformLocation 的调用从当前使用的 program 获得的, 则会生成 INVALID_OPERATION 错误。如果传入的 location 为 null,则传入的数据会被静默忽略,并且不会改变任何 uniform 变量。

如果传给任何向量形式(以 v 结尾的形式)的数组具有 无效长度,则会生成 INVALID_VALUE 错误。如果长度对于所赋值 类型来说太短,或不是该类型的整数倍,则该长度无效。

在带有 srcLength 实参的重载中:

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

void vertexAttribI4[u]iv(GLuint index, ...) (OpenGL ES 3.0.6 §2.8, 手册页)

将传入 index 处的 vertex attribute 设置为给定的常量整数值。 即使中间有对 drawArraysdrawElements 的调用, 通过 vertexAttrib 设置的值也保证会从带有 CURRENT_VERTEX_ATTRIB 参数的 getVertexAttrib 函数返回。

如果传给任何向量形式(以 v 结尾的形式)的数组太短, 则会生成 INVALID_VALUE 错误。

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

将当前绑定到 ARRAY_BUFFER target 的 WebGLBuffer 对象分配给传入 index 处的 vertex attribute。值始终保持为整数值。Size 是每个 attribute 的分量数。Stride 和 offset 的单位为字节。传入的 stride 和 offset 必须适合传入的 type 和 size,否则会生成 INVALID_OPERATION 错误; 参见 Buffer 偏移和步长要求。 如果 offset 为负,则会生成 INVALID_VALUE 错误。 如果没有 WebGLBuffer 绑定到 ARRAY_BUFFER target,且 offset 非零,则会生成 INVALID_OPERATION 错误。在 WebGL 中,最大支持的 stride 为 255;参见 顶点属性数据步长
any getVertexAttrib(GLuint index, GLenum pname) (OpenGL ES 3.0.6 §6.1.12, 手册页)
返回由 pname 请求的关于传入 index 处 vertex attribute 的信息。返回的类型 取决于所请求的信息,如下表所示:
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 个元素)
VERTEX_ATTRIB_ARRAY_INTEGER GLboolean
VERTEX_ATTRIB_ARRAY_DIVISOR GLint

对于 CURRENT_VERTEX_ATTRIB,返回类型由给定 index 最近一次调用 vertexAttrib 系列函数决定。也就是说,如果使用了 vertexAttribI4i*,返回类型将是 Int32Array;如果使用了 vertexAttribI4ui*, 返回类型将是 Uint32Array;否则为 Float32Array。

所有返回序列或 typed arrays 的查询每次都返回一个新对象。

如果 pname 不在上表中,则生成 INVALID_ENUM 错误。

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

写入绘图缓冲区

void clear(GLbitfield mask) (OpenGL ES 3.0.6 §4.2.3, 手册 页)

将 buffer 清除为预设值。如果要清除的 buffer 中包含整数 color buffer, 则生成 INVALID_OPERATION 错误,并且不会清除任何内容。

void vertexAttribDivisor(GLuint index, GLuint divisor) (OpenGL ES 3.0.6 §2.9, 手册页)

设置由 index 标识的 vertex attribute 在绘制时前进的速率。

void drawArrays(GLenum mode, GLint first, GLsizei count) (OpenGL ES 3.0.6 §2.9.3, 手册页)

一个 [绘制操作]

void drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §2.9.3, 手册页)

一个 [绘制操作]

void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount) (OpenGL ES 3.0.6 §2.9.3, 手册页)

一个 [绘制操作]
使用当前启用的 vertex attribute 绘制 instanceCount 个几何体实例。 具有非零 divisor 的 vertex attribute 每 divisor 个实例前进一次。

void drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei instanceCount) (OpenGL ES 3.0.6 §2.9.3, 手册页)

一个 [绘制操作]
使用当前绑定的 element array buffer 绘制 instanceCount 个几何体实例。 具有非零 divisor 的 vertex attribute 每 divisor 个实例前进一次。

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

一个 [绘制操作]
使用当前绑定的 element array buffer 进行绘制。WebGL 1.0 规范的 写入绘图缓冲区一节中 为 drawElements 指定的所有错误条件均适用。

此外,如果用于绘制的索引超出 [start, end] 范围, 实现可以保证 启用的顶点属性和范围检查 中定义的行为,或者简单地丢弃 startend 实参并改为调用 drawElements。在任一情况下, 都不应因此生成 GL 错误。

在调用 drawElementsdrawArraysdrawRangeElements 及其 instanced 变体期间,WebGL 2.0 会执行超出 OpenGL ES 3.0 规定的额外错误检查:

读回像素

当前 framebuffer 中的像素可以读回到 ArrayBufferView 对象,或读回到绑定到 PIXEL_PACK_BUFFER target 的 WebGLBuffer。

这里只描述与 WebGL 1.0 中 读回像素 的差异。

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, 手册 页)
一个 [读取操作]

如果 WebGLBuffer 绑定到 PIXEL_PACK_BUFFER target,则生成 INVALID_OPERATION 错误。

如果不满足 pixel store parameter 约束, 则生成 INVALID_OPERATION 错误。

如果 dstDatadstOffset 开始没有足够空间用于读取操作, 则生成 INVALID_OPERATION

这是一个阻塞操作,因为 WebGL 必须完全完成所有 先前对源 framebuffer 的渲染操作,才能返回结果。 在多进程 WebGL 实现中,它还会产生一次昂贵的跨进程往返, 以从远程进程获取结果。

可考虑改为使用 readPixels 读入 PIXEL_PACK_BUFFER。使用 getBufferSubData 从该 buffer 读取数据。 (参见 getBufferSubData 了解如何避免在该调用中阻塞。)

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

如果没有 WebGLBuffer 绑定到 PIXEL_PACK_BUFFER target,则生成 INVALID_OPERATION 错误。

offset 是 WebGLBuffer 数据存储中的字节偏移;如果小于 0, 则生成 INVALID_VALUE 错误。如果在考虑 pixel store 模式的情况下, WebGLBuffer 数据存储的剩余部分不足以取回指定矩形中的所有像素, 则生成 INVALID_OPERATION

Multiple render targets

void drawBuffers(sequence<GLenum> buffers) (OpenGL ES 3.0.6 §4.2.1, 手册页)

定义所有 fragment color 要写入的 draw buffer。
这不会绘制,只是为后续调用设置状态。

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, 手册页) 这些是 [绘制操作]

将指定 buffer 中的每个像素设置为一个常量值。应为 color buffer 使用哪个 clearBuffer 函数取决于 color buffer 的类型, 如下表所示:
buffer 类型 clearBuffer 函数
floating point clearBufferfv
fixed point clearBufferfv
signed integer clearBufferiv
unsigned integer clearBufferuiv

如果 bufferCOLOR_BUFFER 且函数未按上表选择, 则生成 INVALID_OPERATION 错误,并且不会清除任何内容。

对于 ArrayBufferView 入口点,如果 values 中从 srcOffset 开始没有足够元素,则生成 INVALID_VALUE

clearBufferfi 可用于清除 depth 和 stencil buffer。 buffer 必须为 DEPTH_STENCIL,且 drawBuffer 必须为零。depthstencil 分别为 depth 和 stencil 值。

如果此函数尝试清除完整 framebuffer 的缺失附件,则不会清除任何内容, 也不会生成错误, 依照 绘制到缺失附件

Query 对象

WebGLQuery createQuery() (OpenGL ES 3.0.6 §2.14, 手册页)

创建一个 WebGLQuery 对象,并像调用 glGenQueries 一样用一个 query 对象名称初始化它。

void deleteQuery(WebGLQuery? query) (OpenGL ES 3.0.6 §2.14, 手册页)

如果 query 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将传入 WebGLQuery 中包含的 query 对象标记为删除, 就像调用 glDeleteQueries 一样。 如果对象已经被标记为删除,则该调用没有效果。注意, 当 JS 对象被销毁时,底层 GL 对象会被自动标记为删除, 不过此方法允许作者提前将对象标记为删除。

[WebGLHandlesContextLoss] GLboolean isQuery(WebGLQuery? query) (OpenGL ES 3.0.6 §6.1.7, 手册页)

如果传入的 WebGLQuery 有效则返回 true,否则返回 false。

如果 query 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则返回 false。

如果 query 的 invalidated 标志已设置,则返回 false。

void beginQuery(GLenum target, WebGLQuery query) (OpenGL ES 3.0.6 §2.14, 手册页)

如果 query 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

开始一个异步 query。Target 表示要执行的 query 类型。

void endQuery(GLenum target) (OpenGL ES 3.0.6 §2.14, 手册页)

标记要为 target 给定的 query 类型跟踪的命令序列结束。 当最终 query 结果可用时,query 对象会被更新以指示这一点, 并且可以通过调用 getQueryParameter 取回结果。

WebGLQuery? getQuery(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.7, 手册页)

返回关于 query target target 的信息;对于 occlusion queries, 它必须是 ANY_SAMPLES_PASSEDANY_SAMPLES_PASSED_CONSERVATIVE 之一,或对于 primitive queries,为 TRANSFORM_FEEDBACK_PRIMITIVES_WRITTENpname 指定 query 对象 target 参数的符号名称。 目前它必须为 CURRENT_QUERY,并返回该 target 当前活动的 query,或 null。

如果 targetpname 不在上面的列表中,则生成 INVALID_ENUM 错误并返回 null。

如果在执行此函数期间生成任何 OpenGL 错误,则返回 null。

any getQueryParameter(WebGLQuery query, GLenum pname) (OpenGL ES 3.0.6 §6.1.7, 手册页)

如果 query 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

返回 query 对象的参数 pnameQUERY_RESULT 返回 query 对象的 passed samples 计数器值。 QUERY_RESULT_AVAILABLE 返回 samples 计数器是否立即可用。 返回的类型是所请求 pname 的自然类型,如下表所示:

pname 返回类型
QUERY_RESULT GLuint
QUERY_RESULT_AVAILABLE GLboolean

如果 pname 不在上表中,则生成 INVALID_ENUM 错误并返回 null。

如果 query 不是有效的 query 对象,或是当前活动的 query 对象, 则生成 INVALID_OPERATION 错误并返回 null。

如果在执行此函数期间生成任何 OpenGL 错误,则返回 null。

为了确保跨平台的一致行为,queries 的结果只能在用户代理的 event loop 未执行 task 时变为可用。换句话说:

当控制权返回到用户代理的 event loop 时,query 的结果可能变为可用,也可能不会。 不保证使用一次延迟为 0 的 setTimeout 回调,或一次 requestAnimationFrame 回调, 就能为 WebGL 实现提供 query 结果留下足够时间。
与 OpenGL ES 3.0 规范相比,此更改被强制执行,是为了防止 应用程序依赖于能够在同一帧中发出 query 并获取其结果。 为了确保设备间最佳可移植性以及实现间最佳性能,应用程序必须预期 queries 的结果将异步变为可用。

Sampler 对象

WebGLSampler createSampler() (OpenGL ES 3.0.6 §3.8.2, 手册页)

创建一个 WebGLSampler 对象,并像调用 glGenSamplers 一样,用 sampler 对象名称初始化它。

void deleteSampler(WebGLSampler? sampler) (OpenGL ES 3.0.6 §3.8.2, 手册页)

如果 sampler 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将传入的 WebGLSampler 中包含的 sampler 对象 标记为删除,就像调用 glDeleteSamplers 一样。 如果对象已经被标记为删除,则该调用没有效果。注意, 当 JS 对象被销毁时,底层 GL 对象会被自动标记为删除, 不过此方法允许作者提前将对象标记为删除。

[WebGLHandlesContextLoss] GLboolean isSampler(WebGLSampler? sampler) (OpenGL ES 3.0.6 §6.1.5, 手册页)

如果传入的 WebGLSampler 有效则返回 true,否则返回 false。

如果 sampler 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则返回 false。

如果 sampler 的 invalidated 标志已设置,则返回 false。

void bindSampler(GLuint unit, WebGLSampler? sampler) (OpenGL ES 3.0.6 §3.8.2, 手册页)

如果 sampler 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将传入 WebGLSampler 中包含的 sampler 对象绑定到传入索引处的 texture unit。如果 sampler 绑定到 texture unit,则 sampler 的状态会取代 绑定到该 texture unit 的 texture 的采样状态。如果 sampler 为 null,则当前绑定的 sampler 会从 texture unit 解绑。单个 sampler 对象可以同时绑定到 多个 texture unit。

如果 unit 大于或等于 MAX_COMBINED_TEXTURE_IMAGE_UNITS 的值, 则生成 INVALID_VALUE 错误。

尝试绑定一个已标记为删除的对象会生成 INVALID_OPERATION 错误,并且当前绑定保持不变。

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

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

(OpenGL ES 3.0.6 §3.8.2, 手册页)

如果 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 对象,则生成 INVALID_OPERATION 错误。

any getSamplerParameter(WebGLSampler sampler, GLenum pname) (OpenGL ES 3.0.6 §6.1.5, 手册页)
如果 sampler 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

返回 pname 所请求的关于给定 WebGLSampler(作为 sampler 传入)的信息。 返回的类型取决于所请求的信息,如下表所示:
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 对象,则生成 INVALID_OPERATION 错误。

如果在执行此函数期间生成任何 OpenGL 错误,则返回 null。

Sync 对象

Sync 对象可用于在 GL server 和 client 之间同步执行。

WebGLSync? fenceSync(GLenum condition, GLbitfield flags) (OpenGL ES 3.0.6 §5.2, 手册页)

创建新的 fence sync 对象,并在 GL 命令流中插入关联的 fence 命令。

[WebGLHandlesContextLoss] GLboolean isSync(WebGLSync? sync) (OpenGL ES 3.0.6 §6.1.8, 手册 页)

如果传入的 WebGLSync 有效则返回 true,否则返回 false。

如果 sync 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则返回 false。

如果 sync 的 invalidated 标志已设置,则返回 false。

void deleteSync(WebGLSync? sync) (OpenGL ES 3.0.6 §5.2, 手册页)

如果 sync 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将传入的 WebGLSync 中包含的 sync 对象 标记为删除,就像调用 glDeleteSync 一样。 如果对象已经被标记为删除,则该调用没有效果。注意, 当 JS 对象被销毁时,底层 GL 对象会被自动标记为删除, 不过此方法允许作者提前将对象标记为删除。

GLenum clientWaitSync(WebGLSync sync, GLbitfield flags, GLuint64 timeout) (OpenGL ES 3.0.6 §5.2.1, 手册页)

如果 sync 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

阻塞执行,直到传入的 sync 对象被 signal,或指定的 timeout 已经 过去。timeout 的单位是纳秒。

返回四种状态值之一。返回值 ALREADY_SIGNALED 表示 在调用 clientWaitSync 时,sync 已经被 signal。 如果 sync 已被 signal,则始终会返回 ALREADY_SIGNALED,即使 timeout 为零。返回值 TIMEOUT_EXPIRED 表示指定的 timeout 周期在 sync 被 signal 之前已到期。返回值 CONDITION_SATISFIED 表示 sync 在 timeout 到期之前被 signal。最后,如果发生错误, 除了按下文指定生成错误外,还会返回 WAIT_FAILED,且不会阻塞。

flags 控制命令刷新行为,并且可以包含 SYNC_FLUSH_COMMANDS_BIT。如果 flags 中设置了 任何其他位,则生成 INVALID_OPERATION 错误。如果 flags 中设置了 SYNC_FLUSH_COMMANDS_BIT,且在调用 clientWaitSyncsync 未被 signal, 则会在阻塞等待 sync 之前执行等价于 flush 的操作。

差异一节中所讨论的,WebGL 实现必须施加 较短的最大 timeout,以防止主线程长时间阻塞。可通过以 MAX_CLIENT_WAIT_TIMEOUT_WEBGL 为实参调用 getParameter 来查询实现定义的 timeout。如果 timeout 大于此实现定义的 timeout,则生成 INVALID_OPERATION 错误。

实现定义的最大 timeout 未被指定。它应设置得足够低,以防止应用程序 因长时间等待而损害交互性。实现可以施加零最大 timeout。 WebGL 应用程序不应使用 clientWaitSync 长时间阻塞执行。

如果在执行此函数期间生成任何 OpenGL 错误,则返回 WAIT_FAILED

为了确保跨平台的一致行为,sync 对象只能在用户代理的 event loop 未执行 task 时转换到 signaled 状态。换句话说:

void waitSync(WebGLSync sync, GLbitfield flags, GLint64 timeout) (OpenGL ES 3.0.6 §5.2.1, 手册页)

如果 sync 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

立即返回,但在 GL server 上等待,直到传入的 sync 对象被 signal,或依赖于实现的 timeout 已经过期。传入的 timeout 必须设置为 TIMEOUT_IGNORED
在不存在多个 GL 上下文之间同步可能性的情况下,调用 waitSync 实际上是 no-op。
any getSyncParameter(WebGLSync sync, GLenum pname) (OpenGL ES 3.0.6 §6.1.8, 手册 页)
如果 sync 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

在给定传入 WebGLSync 对象的情况下,返回传入 pname 的值。返回的类型是 所请求 pname 的自然类型,如下表所示:
pname 返回类型
OBJECT_TYPE GLenum
SYNC_STATUS GLenum
SYNC_CONDITION GLenum
SYNC_FLAGS GLbitfield

如果 pname 不在上表中,则生成 INVALID_ENUM 错误并返回 null。

如果在执行此函数期间生成任何 OpenGL 错误,则返回 null。

为了确保跨平台的一致行为,sync 对象只能在用户代理的 event loop 未执行 task 时转换到 signaled 状态。换句话说:

Transform feedback

Transform feedback 模式捕获由 vertex shader 写入的输出变量值。 顶点会在 flatshading 和 clipping 之前被捕获。变换后的顶点可以在存储到一个或多个 buffer 对象之后被可选地丢弃,或者可以继续传递到 clipping 阶段以进行进一步处理。捕获的输出变量集合在 program 链接时确定。

存在一个默认的 Transform Feedback 对象,由 null WebGLTransformFeedback handle 表示。 在上下文的初始状态下,默认对象被绑定。 绑定时,getParameter(TRANSFORM_FEEDBACK_BINDING) 返回 null

如果指定任何输出变量流式传输到 transform feedback buffer 对象, 但 vertex shader 实际上没有写入它,则该值设置为 0。参见 Transform feedback 图元捕获

WebGLTransformFeedback createTransformFeedback() (OpenGL ES 3.0.6 §2.15.1, 类似于 glGenTransformFeedbacks)
创建一个 WebGLTransformFeedback 对象,并像调用 glGenTransformFeedbacks 一样,用 transform feedback 对象名称初始化它。
void deleteTransformFeedback(WebGLTransformFeedback? transformFeedback) (OpenGL ES 3.0.6 §2.15.1, 类似于 glDeleteTransformFeedbacks)
如果 transformFeedback 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将传入 WebGLTransformFeedback 中包含的 transform feedback 对象标记为删除,就像调用 glDeleteTransformFeedbacks 一样。 如果对象已经被标记为删除,则该调用没有效果。注意, 当 JS 对象被销毁时,底层 GL 对象会被自动标记为删除, 不过此方法允许作者提前将对象标记为删除。
[WebGLHandlesContextLoss] GLboolean isTransformFeedback(WebGLTransformFeedback? transformFeedback) (OpenGL ES 3.0.6 §6.1.11, 手册页)
如果传入的 WebGLTransformFeedback 有效则返回 true, 否则返回 false。

如果 transform feedback 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则返回 false。

如果 transform feedback 的 invalidated 标志已设置,则返回 false。
void bindTransformFeedback(GLenum target, WebGLTransformFeedback? transformFeedback) (OpenGL ES 3.0.6 §2.15.1, 手册 页)
如果 transformFeedback 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

绑定给定的 WebGLTransformFeedback 对象。 如果 transformFeedback 为 null,则绑定由上下文提供的 默认 transform feedback 对象。 尝试绑定一个已标记为删除的对象会生成 INVALID_OPERATION 错误,并且当前绑定保持不变。
void beginTransformFeedback(GLenum primitiveMode) (OpenGL ES 3.0.6 §2.15.2, 手册 页)
void endTransformFeedback() (OpenGL ES 3.0.6 §2.15.2, 手册 页)
void pauseTransformFeedback() (OpenGL ES 3.0.6 §2.15.2, 手册 页)
void resumeTransformFeedback() (OpenGL ES 3.0.6 §2.15.2, 手册 页)
void transformFeedbackVaryings(WebGLProgram program, sequence<DOMString> varyings, GLenum bufferMode) (OpenGL ES 3.0.6 §2.12.8, 手册 页)
如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

WebGLActiveInfo? getTransformFeedbackVarying(WebGLProgram program, GLuint index) (OpenGL ES 3.0.6 §2.12.8, 手册 页)
如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误并返回 null。

Uniform Buffer 对象

Uniform buffer 对象为命名 uniform blocks 提供存储,因此命名 uniform blocks 中的 active uniforms 的值可以通过修改 buffer 对象内容来改变。

void bindBufferBase(GLenum target, GLuint index, WebGLBuffer? buffer) (OpenGL ES 3.0.6 §2.10.1.1, 手册页)
如果 buffer 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将给定的 WebGLBuffer 对象绑定到由 target 指定的 targets 数组中 index 处的绑定点。
void bindBufferRange(GLenum target, GLuint index, WebGLBuffer? buffer, GLintptr offset, GLsizeiptr size) (OpenGL ES 3.0.6 §2.10.1.1, 手册页)
如果 buffer 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将由 offsetsize 表示的 WebGLBuffer 对象 buffer 的一个范围, 绑定到由 target 指定的 targets 数组中 index 处的绑定点。
sequence<GLuint>? getUniformIndices(WebGLProgram program, sequence<DOMString> uniformNames) (OpenGL ES 3.0.6 §2.12.6, 手册页)
如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

取回 program 内多个 uniforms 的索引。

如果在执行此函数期间生成任何 OpenGL 错误,则返回 null。
any getActiveUniforms(WebGLProgram program, sequence<GLuint> uniformIndices, GLenum pname) (OpenGL ES 3.0.6 §2.12.6, 手册页)
如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

查询 program 内由 uniformIndices 数组指定索引的每个 uniform 的 名为 pname 的参数值。返回的类型是所请求 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, 手册 页)
如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

取回 program 内 uniform block 的索引。
any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname) (OpenGL ES 3.0.6 §2.12.6, 手册 页)
如果 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 错误。

如果 uniformBlockIndex 不是 program 的 active block uniform,或大于等于 ACTIVE_UNIFORM_BLOCKS 的值,则生成 INVALID_VALUE 错误。

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

DOMString? getActiveUniformBlockName(WebGLProgram program, GLuint uniformBlockIndex) (OpenGL ES 3.0.6 §2.12.6, 手册 页)
如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

取回 program 内位于 uniformBlockIndex 的 active uniform block 的名称。
void uniformBlockBinding(WebGLProgram program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) (OpenGL ES 3.0.6 §2.12.6.5, 手册页)
如果 program 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

为 active uniform blocks 分配绑定点。

Vertex Array 对象

Vertex Array 对象(有时称为 VAO)封装了与 vertex processor 所使用数据的定义相关的全部状态。

存在一个默认的 Vertex Array 对象,由 null WebGLVertexArrayObject handle 表示。 在上下文的初始状态下,默认对象被绑定。 绑定时,getParameter(VERTEX_ARRAY_BINDING) 返回 null

void bindVertexArray(WebGLVertexArrayObject? vertexArray) (OpenGL ES 3.0.6 §2.11, 手册页)
如果 vertexArray 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

绑定给定的 WebGLVertexArrayObject 对象。 如果 vertexArray 为 null,则绑定由上下文提供的 默认 vertex array。 尝试绑定已删除的 vertex array 会生成 INVALID_OPERATION 错误,并且 当前绑定保持不变。
WebGLVertexArrayObject createVertexArray() (OpenGL ES 3.0.6 §2.11, 类似于 glGenVertexArrays)
创建一个 WebGLVertexArrayObject 对象,并像调用 glGenVertexArrays 一样,用 vertex array 对象名称初始化它。
void deleteVertexArray(WebGLVertexArrayObject? vertexArray) (OpenGL ES 3.0.6 §2.11, 类似于 glDeleteVertexArrays)
如果 vertexArray 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则生成 INVALID_OPERATION 错误。

将传入的 WebGLVertexArrayObject 中包含的 vertex array 对象标记为删除,就像调用 glDeleteVertexArrays 一样。 如果对象已经被标记为删除,则该调用没有效果。注意, 当 JS 对象被销毁时,底层 GL 对象会被自动标记为删除, 不过此方法允许作者提前将对象标记为删除。
[WebGLHandlesContextLoss] GLboolean isVertexArray(WebGLVertexArrayObject? vertexArray) (OpenGL ES 3.0.6 §6.1.10, 手册页)
如果传入的 WebGLVertexArrayObject 有效则返回 true, 否则返回 false。

如果 vertex array 是由不同于此上下文的另一个 WebGL2RenderingContext 生成的,则返回 false。

如果 vertex array 的 invalidated 标志已设置,则返回 false。

WebGL 2.0 与 WebGL 1.0 之间的其他差异

需要针对 WebGL 2.0 更新

向后不兼容性

错误

在 WebGL 1.0 API 会生成错误的情况下,WebGL 2.0 API 的行为可能不同。 针对 WebGL 1.0 API 编写且会生成错误的代码,不保证与 WebGL 2.0 向前兼容。

扩展

一些可能已在 WebGL 1.0 API 中受支持的扩展,会从 WebGL 2.0 API 中移除。更多详细信息,参见 WebGL Extension Registry

通常只有在 WebGL 2.0 API 的核心规范或改进后的扩展中提供了等价功能时, 扩展才会被移除。当使用 WebGL 1.0 扩展的应用程序被修改为在 WebGL 2.0 API 上运行时,通常可以为每个已提升的扩展创建一个 dummy extension 对象, 它只需将调用重定向到适当的 WebGL 2.0 API 函数即可。如果应用程序正在使用 shader language 扩展,通常需要将 shader 移植到 GLSL ES 3.00。

非 2 的幂纹理访问

WebGL 2.0 API 中的纹理访问与 OpenGL ES 3.0 API 中相同。换句话说, 与 WebGL 1.0 API 不同,非 2 的幂纹理没有特殊限制。对于非 2 的幂图像, 支持所有 mipmapping 和所有 wrapping 模式。

Primitive Restart 始终启用

参见 PRIMITIVE_RESTART_FIXED_INDEX 始终启用一节。

Framebuffer Object 附件

在 WebGL 1.0 中,DEPTH_STENCIL_ATTACHMENT 是不同于 DEPTH_ATTACHMENTSTENCIL_ATTACHMENT 的替代附件点。然而在 WebGL 2.0 中, DEPTH_STENCIL_ATTACHMENT 被视为 DEPTH_ATTACHMENT + STENCIL_ATTACHMENT 的别名,即同一图像会同时附加到 DEPTH_ATTACHMENTSTENCIL_ATTACHMENT,覆盖原本附加到这两个附件点的图像。

考虑以下操作序列:

  1. 将 renderbuffer 1 附加到 DEPTH_ATTACHMENT
  2. 将 renderbuffer 2 附加到 DEPTH_STENCIL_ATTACHMENT
  3. null 附加到 DEPTH_STENCIL_ATTACHMENT
在 WebGL 1.0 中,framebuffer 最终会有 renderbuffer 1 附加到 DEPTH_ATTACHMENT,且没有图像 附加到 STENCIL_ATTACHMENT;然而在 WebGL 2.0 中,DEPTH_ATTACHMENTSTENCIL_ATTACHMENT 都没有附加图像。

Framebuffer Object 附件中定义的约束 在 WebGL 2.0 中不再适用。

如果不同图像被绑定到 depth 和 stencil 附件点,则 checkFramebufferStatus 返回 FRAMEBUFFER_UNSUPPORTED,并且以 DEPTH_STENCIL_ATTACHMENT 作为 attachment 调用 getFramebufferAttachmentParameter 会生成 INVALID_OPERATION 错误。

TexSubImage2D 调用中的纹理类型

在 WebGL 1.0 API 中,传给 texSubImage2Dtype 实参必须 匹配最初定义 texture 对象时(即使用 texImage2D 时)所用的类型。 在 WebGL 2.0 API 中,此限制已被解除。

copyTexSubImage2D 和 readPixels 调用中的越界行为

在 WebGL 1.0 的 读取 Framebuffer 之外的像素中,要求 copyTexSubImage2DreadPixels 不得触及 越界像素对应的目标范围。

在 WebGL 2.0 中,当绑定了 PACK_BUFFER 对象且 PACK_ROW_LENGTH 非零并小于 width,或者当绑定了 UNPACK_BUFFER 对象且 UNPACK_ROW_LENGTH 非零并小于 width,或 UNPACK_IMAGE_HEIGHT 非零并小于 height 时,打包/解包一行/图像可能会延伸到下一行/图像。 如果该部分越界,值可能会相应改变。

copyTex{Sub}Image2D 中的颜色转换

在 WebGL 1.0(OpenGL ES 2.0)中,允许 internalformat 的分量大小小于源 buffer 的 internal format 中对应分量的大小。然而,在 WebGL 2.0(OpenGL ES 3.0)中, 如果 internalformat 是 sized,则其分量大小必须与源 buffer 的有效 internal format 中对应分量的大小完全匹配。

在 WebGL 1.0 和 2.0 中,源 buffer 分量都可以在转换为 internalformat 的过程中被丢弃,但不能添加新的分量。

带 FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 的 getFramebufferAttachmentParameter

如果以 pname FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 调用 getFramebufferAttachmentParameter,且 attachment 没有 附加图像,则在 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] 编写的 shader,但带有一些限制。

与 WebGL 1.0 API 中一样,以 "webgl_" 和 "_webgl_" 开头的标识符保留给 WebGL 使用。声明以这些前缀开头的函数、变量、结构名称或结构字段的 shader 不得被允许加载。

最大 GLSL Token 大小

WebGL 1.0 支持长度最多为 256 个字符的 token。WebGL 2.0 遵循 The OpenGL ES Shading Language, Version 3.00 (OpenGL ES 3.0.6 §1.5.1), 并允许 ESSL 1 和 ESSL 3 shader 中的 token 长度最多为 1024 个字符。包含长度 超过 1024 个字符 token 的 shader 必须编译失败。

最大 Uniform 和 Attribute Location 长度

WebGL 2.0 对 uniform 和 attribute location 的长度施加 1024 个字符的限制。

Vertex Attribute Divisor

在 WebGL 2.0 API 中,具有非零 divisor 的 vertex attribute 在调用 drawArraysdrawElements 期间不会前进。 (OpenGL ES 3.0.6 §2.9.3)

WebGL 与 OpenGL ES 3.0 之间的差异

本节描述相对于 OpenGL ES 3.0 API 对 WebGL API 所做的更改, 这些更改用于提升在各种操作系统和设备之间的可移植性。

Buffer Object 绑定

WebGL buffer 类型 设置此类型的绑定点
undefined
element array ELEMENT_ARRAY_BUFFER
other data 除 ELEMENT_ARRAY_BUFFER、COPY_READ_BUFFER 和 COPY_WRITE_BUFFER 之外的所有绑定点

在 WebGL 2.0 API 中,buffer 的 WebGL buffer 类型最初设置为 undefined。 以 target 实参设置为除 COPY_READ_BUFFERCOPY_WRITE_BUFFER 之外的任何 buffer 绑定点来调用 bindBufferbindBufferRangebindBufferBase,随后会根据上表设置被绑定 buffer 的 WebGL buffer 类型。将类型为 undefined 的 buffer 绑定到 COPY_READ_BUFFERCOPY_WRITE_BUFFER 绑定点, 会将其类型设置为 other data

任何试图绑定已删除 buffer 的上述函数调用,都会生成 INVALID_OPERATION 错误,并且绑定保持不变。

任何试图将具有 element array WebGL buffer 类型的 WebGLBuffer 绑定到属于 other data 的绑定点, 或将具有 other data WebGL buffer 类型的 WebGLBuffer 绑定到 ELEMENT_ARRAY_BUFFER 的上述函数调用,都会生成 INVALID_OPERATION 错误,并且绑定点的状态保持不变。

此限制意味着给定的 buffer 对象可以包含索引或其他数据,但不能同时包含两者。

这些限制类似于 WebGL 1.0 规范中的 buffer object 绑定 限制

添加此限制是为了防止在 GPU 上写入 index buffer,因为这会使 对 index data 执行任何 CPU 侧检查的代价变得过高。将 index buffer 与其他 buffer data 区分处理,也能更好地映射到 Direct3D API。

复制 Buffer

试图使用 copyBufferSubData 在具有 element arrayother data WebGL buffer 类型的 buffer 之间复制, 如 Buffer Object 绑定一节所规定, 会生成 INVALID_OPERATION 错误,并且不执行复制。

与上面的 Buffer Object 绑定限制相同。

防止 Transform Feedback 中的未定义行为

一个同时绑定到当前绑定的 transform feedback 对象中的索引 TRANSFORM_FEEDBACK_BUFFER 绑定点,以及 WebGL API 中任何其他绑定点 (generic TRANSFORM_FEEDBACK_BUFFER 绑定点除外)的 buffer, 不能被使用。任何尝试使用这种双重绑定 buffer 的操作都会以 INVALID_OPERATION 错误失败,无论 transform feedback 是否启用。 例如,如果 buffer 也绑定到当前 transform feedback 对象,则对 PIXEL_PACK_BUFFER 执行 readPixels 会失败。

如果不生成错误,读取或写入的值将是未定义的。 ( OpenGL ES 3.0.6 §2.15.2)

如果同一 buffer 在活动 transform feedback 中绑定到多个索引绑定点, beginTransformFeedback 会生成 INVALID_OPERATION 错误。

这只可能发生在 SEPARATE_ATTRIBS 模式中。
这是 D3D11 的限制,其中不允许将两个不同的流写入同一个 buffer。

Draw Buffer

MAX_COLOR_ATTACHMENTS 参数的值必须等于 MAX_DRAW_BUFFERS 参数的值。

这些参数没有不同的使用场景。

如果 ESSL1 fragment shader 既没有写入 gl_FragColor,也没有写入 gl_FragData,则 shader 执行后的 fragment color 值保持不变。 如果 ESSL3 fragment shader 中没有定义对应的输出变量,则 shader 执行后的 fragment color 值保持不变。

所有用户定义的输出变量如果在 shader 执行期间未被写入,则默认为零。

为获得最佳性能,输出数组不应包含任何未被访问的元素。

如果满足以下条件,则 draw buffer 与 fragment shader “shader-output-incompatible”:

如果任何 draw buffer 为 “shader-output-incompatible”,则在以下情况下 draw 会生成 INVALID_OPERATION

无 Program 二进制

WebGL 2.0 API 不支持访问已编译 shader program 的二进制表示。 这包括 OpenGL ES 3.0 的 GetProgramBinaryProgramBinaryProgramParameteri 入口点。此外,WebGL 2.0 API 不支持通过 getProgramParameter 查询 program binary 长度,以及通过 getParameter 查询 program binary 格式。

范围检查

除了 WebGL 1.0 规范 启用的顶点属性和范围检查一节中规定的范围检查外, drawElementsdrawRangeElementsdrawElementsInstanced 引用的、超过 MAX_ELEMENT_INDEX 参数的索引, 会导致 draw 调用生成 INVALID_OPERATION 错误,即使它们位于已绑定 buffer 的存储范围内。如果 primitive restart 已启用,则不会对触发 primitive restart 的索引执行范围检查。WebGL 1.0 API 中为 drawArrays 规定的范围检查,也适用于 WebGL 2.0 API 中的 drawArraysInstanced

OpenGL robustness 扩展没有规定使用超过 MAX_ELEMENT_INDEX 的索引时会发生什么, 因此将它们传给 driver 是有风险的。在 MAX_ELEMENT_INDEX 与最大无符号整数值相同的平台上, 本节不会产生影响。

Active Uniform Block Backing

在 WebGL 2.0 API 中,如果用于 draw 命令的 program 中任何 active uniform block 没有由足够大的 buffer 对象 backing,则试图用 drawArraysdrawElementsdrawRangeElements 或其 instanced 变体进行绘制, 会生成 INVALID_OPERATION 错误。

在 OpenGL 中,uniform block backing 不足被允许导致 GL 中断或终止。 参见 OpenGL ES 3.0 规范第 2.12.6 节 ( OpenGL ES 3.0.6 §2.12.6),在 “Uniform Buffer Object Bindings” 下。

默认 Framebuffer

WebGL 始终具有默认 framebuffer。FRAMEBUFFER_UNDEFINED enumerant 从 WebGL 2.0 API 中移除。

字符串长度查询

在 WebGL 2.0 API 中,除 WebGL 1.0 API 中移除的类似 enumerants外, 还移除了 ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTHTRANSFORM_FEEDBACK_VARYING_MAX_LENGTHUNIFORM_BLOCK_NAME_LENGTHUNIFORM_NAME_LENGTH enumerants。

无效 Clear

在 WebGL 2.0 API 中,当指定 clear 值的类型与正在清除的 buffer 类型不匹配时 尝试执行 clear,会生成 INVALID_OPERATION 错误,而不是产生未定义结果。

无效纹理偏移

如果 GLSL shader 试图在纹理查找函数实参中使用超出由实现定义参数 MIN_PROGRAM_TEXEL_OFFSETMAX_PROGRAM_TEXEL_OFFSET 指定范围的 texture offset 值,则在 WebGL 2.0 API 中必须编译失败。

使用有效范围之外的 offset 会返回未定义结果,因此不能允许这样做。 根据 GLSL ES 规范,offset 必须是常量表达式,因此可以在编译时 对该值进行正确范围检查。

Texel Fetch

在 OpenGL ES 3.0 API 中具有未定义结果的 texel fetch,在 WebGL 2.0 API 中必须返回零;如果是从不完整纹理进行 texel fetch,则返回 texture source color (0, 0, 0, 1)。

为了保证安全性,越界 texel fetch 的行为需要是可测试的。

GLSL ES 1.00 Fragment Shader 输出

用 The OpenGL ES Shading Language, Version 1.00 编写的 fragment shader, 如果静态地向 gl_FragData[n] 赋值,且 n 不等于常量值 0, 则在 WebGL 2.0 API 中必须编译失败。这是为了与 The OpenGL ES 3.0 specification 第 4.2.1 节 (OpenGL ES 3.0.6 §4.2.1) 以及 The OpenGL ES Shading Language 3.00.6 specification 第 1.5 节 (GLSL ES 3.00.6 §1.5) 保持一致。 与 OpenGL ES 3.0 API 中一样,WebGL 2.0 API 中只有 GLSL ES 3.00 shader 支持多个 fragment shader 输出。

无 MapBufferRange

MapBufferRangeFlushMappedBufferRangeUnmapBuffer 入口点从 WebGL 2.0 API 中移除。以下 enum 值也被移除: BUFFER_ACCESS_FLAGSBUFFER_MAP_LENGTHBUFFER_MAP_OFFSETMAP_READ_BITMAP_WRITE_BITMAP_INVALIDATE_RANGE_BITMAP_INVALIDATE_BUFFER_BITMAP_FLUSH_EXPLICIT_BITMAP_UNSYNCHRONIZED_BIT

不使用 MapBufferRange,buffer data 可以通过 getBufferSubData 入口点读取。

TIMEOUT_IGNORED

在 WebGL 2.0 API 中,TIMEOUT_IGNORED 被定义为值为 -1GLint64,而不是值为 0xFFFFFFFFFFFFFFFFGLuint64。这是因为 Javascript 无法准确表示那么大的整数。出于同样的原因, waitSync 对 timeout 采用 GLint64 值,而不是 GLuint64。

clientWaitSync

在 WebGL 2.0 API 中,WebGL 实现必须对 clientWaitSync 调用强制施加较短的最大 timeout, 以避免长时间阻塞主线程执行。可通过以 MAX_CLIENT_WAIT_TIMEOUT_WEBGL 为实参调用 getParameter 来查询此 timeout。

实现定义的最大 timeout 未被指定。实现可以强制施加零最大 timeout。

Vertex Attribute 别名

WebGL 2.0 API 实现必须严格遵循 GLSL ES 3.00.6 第 12.46 节, 该节规定不允许任何 vertex attribute aliasing。如 [GLES30] 第 57 页所述,按照 WebGL 1.0 规范 Attribute aliasing一节允许的那样, GLSL ES 1.00 shader 仍可使用 alias。

PRIMITIVE_RESTART_FIXED_INDEX 始终启用

在 OpenGL ES 3.0 中由 Enable/Disable 控制的 PRIMITIVE_RESTART_FIXED_INDEX context state,在 WebGL 2.0 中不受支持。相反,WebGL 2.0 的行为就像此状态始终启用一样。这是 与 WebGL 1.0 相比的兼容性差异。

drawElementsdrawElementsInstanceddrawRangeElements 处理索引时,如果该索引的值是数据类型的最大值 (对于 UNSIGNED_BYTE 索引为 255,对于 UNSIGNED_SHORT 为 65535,或对于 UNSIGNED_INT 为 4294967295),则该 vertex 不会正常处理。相反,就像绘图命令在紧邻之前的 vertex 处结束, 并立即以相同参数开始另一个绘图命令,但只传输紧随其后的索引直到 最初指定索引的末尾。

引入此兼容性差异是为了避免基于 Direct3D 的 WebGL 实现中的性能陷阱。 如果不希望 primitive restart 行为,应用程序和内容创建工具可以调整为 避免使用最大 vertex index。

无 texture swizzles

OpenGL ES 3.0 在 texture 对象上引入了新状态,允许对 texture 指定 四通道 swizzle 操作。该 swizzle 会应用于引用该 texture 的任何 shader 中执行的每次 texture lookup。这些 texture swizzles 在 WebGL 2.0 中 不受支持。TEXTURE_SWIZZLE_* enum 值从 WebGL 2.0 API 中移除。

在基于 Direct3D 的 WebGL 实现中,texture swizzles 无法以高性能方式实现。 依赖此功能的应用程序在这些实现上运行会明显变慢。没有此接口时, 应用程序仍然能够在 shader 中 swizzle texture fetch 的结果,并在上传前 swizzle texture data。

对链接失败 program 的查询应失败

OpenGL ES 3.0 允许应用程序枚举和查询指定 program 的 active variables 和 interface blocks 的属性,即使该 program 链接失败 (OpenGL ES 3.0.6 §2.12.3)。 在 WebGL 中,这些命令在链接失败的 program 上始终会生成 INVALID_OPERATION 错误, 并且不返回任何信息。

OpenGL ES 3.0 中返回的信息依赖于实现,并且可能不完整。 添加此错误条件是为了确保所有平台上的行为一致。

来自 fragment shader 的颜色值必须匹配 color buffer 格式

fragment shader 写入的颜色值可以是 floating-point、signed integer 或 unsigned integer。如果 fragment shader 写入的值与对应 color buffer 的格式不匹配, 则结果在 OpenGL ES 3.0 中是未定义的 (OpenGL ES 3.0.6 §3.9.2.3)。在 WebGL 中,会在对应的 draw 调用中 生成 INVALID_OPERATION 错误,包括 drawArraysdrawElementsdrawArraysInstanced drawElementsInstanced drawRangeElements

如果 color buffer 具有 normalized fixed-point 格式,则 floating-point color 值会被转换以匹配该格式;在这种情况下不生成错误。

sampler 类型必须匹配内部纹理格式

Texture lookup 函数根据传给 lookup 函数的 sampler 类型,返回 floating point、 unsigned integer 或 signed integer 值。如果 texture access 使用了错误的 sampler 类型, 即 sampler 类型与 texture internal format 不匹配,则返回值在 OpenGL ES Shading Language 3.00.6 中是未定义的 (OpenGL ES Shading Language 3.00.6 §8.8)。 在 WebGL 中,会在对应的 draw 调用中生成 INVALID_OPERATION 错误, 包括 drawArraysdrawElementsdrawArraysInstanceddrawElementsInstanced drawRangeElements

如果 sampler 类型是 floating point,且 internal texture format 是 normalized integer,则认为它们匹配,并且返回值会转换为 [0, 1] 范围内的 floating point。

Queries 的结果不得在当前帧中变为可用

在 OpenGL ES 3.0 中,如果调用适当的原语(例如 glFinish() 或其他 同步 API),query 的结果可能会在它被发出的同一帧中变为可用。在 WebGL 中, 为了提高应用程序可移植性,query 的结果绝不能在发出该 query 的同一帧中 对应用程序变为可用。讨论和理由见 getQueryParameter 的规范。

GLSL ES 3.00 #extension directive 位置

WebGL 1.0 规范的 GLSL ES #extension directive location 一节只适用于 OpenGL ES Shading Language 1.00 shader。它不适用于用 OpenGL ES Shading Language 3.00 编写的 shader。 在用 OpenGL ES Shading Language 3.00 编写的 shader 中,无论 extension specification 中写了什么,#extension directives 都必须出现在 non-preprocessor token 之前。

这样做是为了使 WebGL 2.0 更严格地遵循成文的 GLSL ES 3.00 规范。 比原生 GLES driver 更严格地强制该限制,可使行为被明确定义。

uniform blocks 中只支持 std140 layout

GLSL ES 3.00 规范支持用于 uniform blocks 的 sharedpackedstd140 layout qualifiers,定义变量如何 布局在 uniform buffer 的存储中。其中,WebGL 2.0 规范只支持 std140 layout,它定义在 OpenGL ES 3.0.6 §2.12 "Vertex Shaders" 的 “Standard Uniform Block Layout” 小节中。试图使用 sharedpacked layout qualifiers 的 shader 将在编译或链接阶段失败。

编译初始状态就像声明了以下内容:

layout(std140) uniform;

强制此限制是为了通过避免暴露特定于某一厂商 GPU 的 uniform block layouts 来提高可移植性。

不允许的 GLSL ES 3.00 运算符变体

在 WebGL 2.0 API 中,不允许以下 shading language 构造, 试图使用它们必须导致编译错误:

此限制确保在支持 OpenGL ES 3.0 的设备之间易于移植。

checkFramebufferStatus 可能返回 FRAMEBUFFER_INCOMPLETE_DIMENSIONS

所有附加图像必须具有相同的宽度和高度;否则,checkFramebufferStatus 返回 FRAMEBUFFER_INCOMPLETE_DIMENSIONS

在 OpenGL ES 3 中,framebuffer 的附加图像不需要具有相同的宽度和 高度即可 framebuffer complete,并且 FRAMEBUFFER_INCOMPLETE_DIMENSIONS 不是 checkFramebufferStatus 的有效返回值之一。然而,在 Direct3D 11 中, Windows 上会在其之上模拟 OpenGL ES 3 行为,所有 render targets 在所有维度中必须具有相同大小 (见 msdn 手册 页)。在 DirectX 11 上模拟 ES3 语义会低效。为了在各平台上具有一致的 WebGL 2.0 行为,合理的做法是在 WebGL 2.0 中保留 OpenGL ES 2 / WebGL 1.0 的限制,即所有附加图像必须具有相同的宽度和高度。

Uniform block 匹配

在 WebGL 2.0 API 中,即使 row_majorcolumn_major layout qualifiers 仅应用于非矩阵变量,它们在匹配的 uniform blocks 中也需要匹配。

已知此 uniform block 匹配规则在 OpenGL ES 3.0 实现之间不一致。

invalidation 后的 framebuffer 内容

在 OpenGL ES 3.0 中,调用 invalidateFramebufferinvalidateSubFramebuffer 后, 受影响区域的内容实际上变为未定义。在 WebGL 2.0 中,要求内容 要么保持不变,要么被清除为其默认值。 (例如 colors 和 stencil 为 0,depth 为 1.0)

WebGL 2.0 实现可以将 invalidateFramebufferinvalidateSubFramebuffer 实现为 no-op。

没有与纹理类型 FLOAT_32_UNSIGNED_INT_24_8_REV 匹配的 ArrayBufferView

在带 ArrayBufferView 的 texImage2DtexImage3D 中,如果 typeFLOAT_32_UNSIGNED_INT_24_8_REVsrcData 不是 null,则生成 INVALID_OPERATION

在带 ArrayBufferView 的 texSubImage2DtexSubImage3D 中,如果 typeFLOAT_32_UNSIGNED_INT_24_8_REV,则生成 INVALID_ENUM

VertexAttrib 函数必须匹配 shader attribute 类型

如果以下任一情况为真,则试图用 drawArraysdrawElementsdrawRangeElements 或其 instanced 变体进行绘制, 会生成 INVALID_OPERATION 错误:

此未定义行为在 OpenGL ES 3.0 规范第 2.8 节中 ( OpenGL ES 3.0.6 §2.8)

Transform feedback 图元捕获

如果任何输出变量被指定为流式传输到 buffer 对象,但 vertex shader 实际上 没有写入它,则该值设置为 0。

此未定义行为在 OpenGL ES 3.0 规范第 2.15.2 节中 ( OpenGL ES 3.0.6 §2.15.2)

gl_FragDepth

如果 fragment shader 静态地向 gl_FragDepth 赋值,则对于任何未执行 给 gl_FragDepth 赋值语句的 fragment,使用值 0。

此未定义行为在 OpenGL ES 3.0 规范第 3.9.2 节中 ( OpenGL ES 3.0.6 §3.9.2)。

Framebuffer 颜色附件

如果一个图像被附加到 framebuffer 中多个颜色附件点, checkFramebufferStatus 返回 FRAMEBUFFER_UNSUPPORTED。 一个图像可以是单独的 mip level、array slice(来自 2D array 或 cube map textures),或 3D texture slice。

这是 Direct3D 11 的限制,在 Windows 上会在其之上模拟 OpenGL ES 3 行为。 (见 msdn 手册 页)。为了在各平台上具有一致的 WebGL 2.0 行为,合理的做法是在 WebGL 2.0 中为所有平台添加此限制。

用于从 TexImageSource 上传的 Pixel store 参数

UNPACK_ALIGNMENTUNPACK_ROW_LENGTH 会被忽略。 UNPACK_ALIGNMENT 以字节为单位指定,并且对于 TexImageSource 对象而言是隐式且 依赖于实现的。UNPACK_ROW_LENGTH 当前未使用。

可以使用 UNPACK_ 参数选择子矩形。 UNPACK_SKIP_PIXELSUNPACK_SKIP_ROWS 确定 子矩形的原点,widthheight 实参确定子矩形的大小。

对于 3D 纹理,widthheightdepth 实参指定要解包到的 texel array 的矩形区域。 UNPACK_SKIP_IMAGESUNPACK_IMAGE_HEIGHT 允许从 2D 源中选择多个切片。UNPACK_IMAGE_HEIGHT 确定两个切片之间的步幅, 单位为行。例如,一个高度为 30 像素的 TexImageSource 可以通过以 height 等于 10、UNPACK_IMAGE_HEIGHT 设置为 20、 且 depth 等于 2 进行上传,将顶部 10 行和底部 10 行上传到 3D 纹理的两个切片中。如果 UNPACK_IMAGE_HEIGHT 为 0,则两个切片之间的 步幅(以行为单位)默认为 height

对于一个宽 20 像素的 HTMLImageElement,为纹理上传传递 width = 10 将导致只选择图像左半部分并上传。因此 得到的纹理宽度为 10。此外,如果在此示例中 UNPACK_SKIP_PIXELS 设置为 10,则只选择图像右半部分 用于 unpack。

此外,UNPACK_SKIP_IMAGES 只适用于 3D 入口点,不适用于 2D 入口点。

再看另一个示例,上方 32x48 的六色图像(每种颜色大小为 16x16)被上传到 一个 width = 2height = 1depth = 3 的 3D 纹理。

Pixel store 参数约束

定义:

如果 PACK_SKIP_PIXELS + width > DataStoreWidth,则 readPixels 生成 INVALID_OPERATION 错误。

如果 UNPACK_SKIP_PIXELS + width > DataStoreWidth, texImage2DtexSubImage2D 会生成 INVALID_OPERATION 错误。如果没有绑定 PIXEL_UNPACK_BUFFERsrcData 为 null,则这不适用于 texImage2D

如果 UNPACK_SKIP_PIXELS + width > DataStoreWidth 或 UNPACK_SKIP_ROWS + height > DataStoreHeight,则 texImage3DtexSubImage3D 会生成 INVALID_OPERATION 错误。如果没有绑定 PIXEL_UNPACK_BUFFERsrcData 为 null,则这不适用于 texImage3D

这些约束规范化了这些参数用于指定像素存储子区域的方式。例如,在 readPixels 情况下,如果我们想将像素存储到整个数据存储的子区域, 可以使用 PACK_ROW_LENGTH 指定数据存储宽度,并使用 PACK_SKIP_PIXELSPACK_SKIP_ROWSwidthheight 指定子区域的 xoffset、yoffset、width 和 height。

这些约束还禁止行和图像重叠,因为这些情况未在 OpenGL ES 3.0 DEQP 测试套件中测试,并且许多 driver 行为不正确。它们还禁止跳过随机像素或行, 但这可以通过相应调整 data store offset 来实现。

此外,对于来自 TexImageSource 的上传,隐含的 UNPACK_ROW_LENGTHUNPACK_ALIGNMENT 没有严格定义。 这些限制确保无论隐含的 UNPACK_ 参数如何,行为都是一致且高效的。

如果 UNPACK_FLIP_Y_WEBGLUNPACK_PREMULTIPLY_ALPHA_WEBGL 设置为 true, 且 texImage2DtexSubImage2DPIXEL_UNPACK_BUFFER 上传数据,则它们会生成 INVALID_OPERATION 错误。

如果 UNPACK_FLIP_Y_WEBGLUNPACK_PREMULTIPLY_ALPHA_WEBGL 设置为 true, 且 texImage3DtexSubImage3DPIXEL_UNPACK_BUFFER 或非 null 的客户端侧 ArrayBufferView 上传数据,则它们会生成 INVALID_OPERATION 错误。

无 ETC2 和 EAC 压缩纹理格式

OpenGL ES 3.0 要求支持以下 ETC2 和 EAC 压缩纹理格式: 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。

这些纹理格式在 WebGL 2.0 中默认不受支持。

这些格式并非大多数桌面 GPU 硬件原生支持。 因此,支持这些格式需要在 WebGL 实现或底层 driver 中进行软件解压。 这会导致显存使用量急剧增加,造成对 WebGL 应用程序不可见的性能损失。

在原生支持 ETC2 和 EAC 压缩纹理格式的硬件上 (例如移动 OpenGL ES 3.0+ 硬件),它们可以通过 WEBGL_compressed_texture_etc 扩展暴露。

UNIFORM_BUFFER_OFFSET_ALIGNMENT 的值必须能被 4 整除

UNIFORM_BUFFER_OFFSET_ALIGNMENT 的值(以 basic machine units 给出)必须能被 4 整除。

如果 UNIFORM_BUFFER_OFFSET_ALIGNMENT 的值不能被 4 整除,则会使上传 ArrayBuffers 到使用 BindBufferRange 绑定的 uniform buffers 变得不切实际。

Sync objects 的结果不得在当前帧中变为可用

在 OpenGL ES 3.0 中,如果调用适当的原语(例如 glFinish() 或其他 同步 API),sync 对象可能会在它被发出的同一帧中被 signal。在 WebGL 中, 为了提高应用程序可移植性,sync 对象绝不能在发出该 sync 的同一帧中 转换到 signaled 状态。讨论和理由见 getSyncParameterclientWaitSync 的规范。

blitFramebuffer 矩形宽度/高度限制

blitFramebuffer() 的 src* 和 dst* 参数必须设置为,使得源矩形和目标矩形的 结果宽度和高度小于或等于可存储在 GLint 中的最大值。如果将任何宽度或高度值 作为 GLint 计算会导致整数溢出,则 blitFramebuffer() 会生成 INVALID_VALUE 错误。

对 blitFramebuffer 使用大于最大 32 位整数大小的矩形会在大多数桌面 OpenGL driver 上触发问题,并且对于 blitFramebuffer 用于缩放 framebuffer 的情况 没有通用 workaround。

GenerateMipmap 要求图像尺寸为正

generateMipmap 要求 TEXTURE_BASE_LEVEL 的各维度都为正。

GLES 3.0.6 从技术上允许在 0x0 图像上调用 GenerateMipmap,不过 cubemap 必须是 cube-complete,因此具有正尺寸。
此更改通过允许 texture 具有 base-level-completeness 概念来简化实现, 因为非 mipmap 采样验证本来也需要该概念。 由于 GenerateMipmap 对 0x0 texture 没有效果,且在 WebGL 1 中是非法的 (0 不是 2 的幂),这是一个容易添加的限制。 此外,否则 GenerateMipmap 将是唯一必须对未定义 texture image 操作的入口点, 跳过了一个其他情况下常见的验证。

如果 query 处于活动状态,deleteQuery 会隐式调用 endQuery

在 GLES 中,即使 query 处于活动状态,DeleteQueries 也不会隐式结束 query。

此偏差最初没有被明确规定,但通过一致性测试在浏览器间被隐式标准化。 一些实现发现此行为更易实现。 将此行为回退为匹配 GLES 规范可能会破坏内容, 并且在此时最好规范我们已经实现的行为。

必需的压缩纹理格式

实现必须支持至少一套压缩纹理格式。


实现必须支持:

为了最好地支持我们的生态系统,我们要求实现支持 ETC2/EAC 格式 (在 GLES3 或类似 driver 上通用,例如许多手机)或 S3TC 格式 (在所有其他 driver 上通用)。这向作者保证,他们始终可以在所有 设备上使用压缩纹理(包括 srgb 变体),同时只需支持少至两种不同格式。

每套格式中对于以下用途都有大致等价的格式:

用途 S3TC/RGTC 选项(桌面) ETC2/EAC 选项(移动)
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 时,即使 texture 使用了 没有所需扩展的 LINEAR filtering,它也始终是 complete 的。然而,LINEAR filtering 是否发生是实现定义的。(实现可以改为执行 NEAREST sampling)

此功能在 GLES 中规定不充分。它很常见,但并非普遍存在。我们在这里选择宽松处理, 尽管实现可以对请求此功能发出警告。

Clamped Constant Blend Color

当底层平台也这样做时,实现可以在存储时 clamp constant blend color。 应用程序可以查询 BLEND_COLOR 参数来检查有效行为。

Generic TRANSFORM_FEEDBACK_BUFFER 状态位置

TRANSFORM_FEEDBACK_BUFFER generic buffer 绑定点已移动到 context state,而不是 per-object state。

OpenGL ES 3.2 中也做了类似更改。

未初始化的压缩纹理

在 OpenGL ES 2.0 中,规范省略了是否应允许创建带未初始化数据的 compressed 2D texture。在 WebGL 1.0 中,这被明确禁止。

在 OpenGL ES 3.0 中,明确允许通过向 glCompressedTexImage2D 传递 null 来创建带未初始化数据的 compressed 2D texture。然而,在 WebGL 2.0 中, 这仍然被明确禁止。用户可以使用带 compressed internal format 的 texStorage2D 来分配零初始化的压缩纹理;不过这些纹理是不可变的, 并且与通过 compressedTexImage2D 分配的纹理并不完全兼容。

参考文献

[WEBGL10]
WebGL 规范 1.0.4 编辑者草案, Dean Jackson, Jeff Gilbert.
[CANVAS]
HTML5:Canvas 元素, World Wide Web Consortium (W3C).
[OFFSCREENCANVAS]
HTML Living Standard - OffscreenCanvas 接口, 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]
RFC 中用于指示要求级别的关键词, S. Bradner. IETF, March 1997.
[WEBIDL]
Web IDL - Living Standard, E. Chen, T. Gu, B. Zbarsky, C. McCormack, T. Langel.