摘要
这是 WebGL 规范的 2.0 版本。
本规范描述了一个附加的渲染上下文和支持对象,用于 HTML 5 的画布元素 [CANVAS]。这个上下文允许使用一个与 OpenGL ES 3.0 API 密切一致的 API 进行渲染。
这份文件应被视为 WebGL 1.0 规范的扩展。它仅会描述与 1.0 版本之间的差异。
文档状态
这份文件是编辑草案。请勿将此文件引用为除了正在进行的工作之外的其他内容。
反馈
欢迎在 public_webgl@khronos.org 邮件列表(指南、档案)上进行此规范的公开讨论。
请在问题跟踪器中提交与规范或其符合性测试相关的错误报告。我们欢迎在 GitHub 存储库上提交拉取请求。
1.引言
WebGL™ 是一种专为网络设计的即时模式 3D 渲染 API。它派生自 OpenGL® ES 2.0,并提供类似的渲染功能,但在 HTML 上下文中使用。WebGL 被设计为 HTML 画布元素的渲染上下文。HTML 画布为网页中的编程渲染提供了一个目标,允许使用不同的渲染 API 进行渲染。Canvas 规范中唯一描述的接口是 2D 画布渲染上下文,CanvasRenderingContext2D。本文档描述了另一个类似的接口,即 WebGLRenderingContext,它呈现 WebGL API。
API 的即时模式性质是与大多数网络 API 不同之处。鉴于 3D 图形的许多用例,WebGL 选择了提供灵活的原语,适用于任何用例。库可以在 WebGL 之上提供更适用于特定领域的 API,从而为 WebGL 添加了一个便捷层,可以加速和简化开发。然而,由于它的 OpenGL ES 2.0 继承,对于熟悉现代桌面 OpenGL 或 OpenGL ES 2.0 开发的开发人员来说,过渡到 WebGL 开发应该是直接的。
1.1 约定
本文档中描述的许多函数都包含到 OpenGL ES 手册的链接。尽最大努力使这些页面与 OpenGL ES 2.0 规范 [GLES20] 匹配,但它们可能包含错误。在出现矛盾的情况下,OpenGL ES 2.0 规范是最终的权威。
本文档的其余部分应与 OpenGL ES 2.0 规范(本文写作时为 2.0.25 版本,可以从 Khronos OpenGL ES API 注册处获取)一起阅读。除非另有说明,每个方法的行为都由 OpenGL ES 2.0 规范定义。为了确保互操作性或安全性,本规范可能会与 OpenGL ES 2.0 有所不同,通常定义了 OpenGL ES 2.0 未定义的实现定义领域。这些差异在“WebGL 与 OpenGL ES 2.0 之间的区别”部分中有总结。
2 上下文创建和绘图缓冲呈现
在使用 WebGL API 之前,作者必须为给定的 HTMLCanvasElement ([CANVAS]) 或 OffscreenCanvas ([OFFSCREENCANVAS]) 获取一个 WebGLRenderingContext 对象,如下所述。这个对象用于管理 OpenGL 状态并渲染到绘图缓冲区,在上下文创建时必须创建绘图缓冲区。
2.1 上下文创建
每个 WebGLRenderingContext 都有一个关联的 canvas,在创建时设置,它可以是一个 canvas [CANVAS] 或离屏 canvas [OFFSCREENCANVAS]。
每个 WebGLRenderingContext 都有上下文创建参数,在创建时在一个 WebGLContextAttributes 对象中设置。
每个 WebGLRenderingContext 都有实际上下文参数,在每次创建绘图缓冲区时,在一个 WebGLContextAttributes 对象中设置。
每个 WebGLRenderingContext 都有一个 WebGL 上下文丢失标志,在初始状态下未设置。
当 canvas 元素或离屏 canvas 对象的 getContext() 方法要返回一个新的用于 contextId webgl ([CANVASCONTEXTS]) 的对象时,用户代理必须执行以下步骤:
- 创建一个新的
WebGLRenderingContext对象,命名为context。 - 让
context的 canvas 为与getContext()方法关联的 canvas 或离屏 canvas。 - 创建一个新的
WebGLContextAttributes对象,命名为contextAttributes。 - 如果
getContext()是通过第二个参数options调用的,则从options中的指定属性设置contextAttributes的属性。 - 使用在
contextAttributes中指定的设置创建绘图缓冲区,并将绘图缓冲区与context关联。 - 如果绘图缓冲区的创建失败,则执行以下步骤:
- 在
canvas上触发一个 WebGL 上下文创建错误事件。 - 返回
null并终止这些步骤。
- 在
- 创建一个新的
WebGLContextAttributes对象,命名为actualAttributes。 - 基于新创建的绘图缓冲区的属性设置
actualAttributes的属性。 - 将
context的上下文创建参数设置为contextAttributes。 - 将
context的实际上下文参数设置为actualAttributes。 - 返回
context。
experimental-webgl画布上下文类型在历史上被用来访问那些尚未完整或符合规范的 WebGL 实现。
如果用户代理同时支持 webgl 和 experimental-webgl 画布上下文类型,它们应被视为别名。例如,如果调用 getContext('webgl') 成功创建了一个 WebGLRenderingContext,随后对 getContext('experimental-webgl') 的调用应返回同一个上下文对象。
2.2 绘制缓冲区
与WebGL 1.0不同,WebGL 2.0中的深度、模板和抗锯齿属性必须由WebGL实现遵守。
3 Dom接口
本节描述了添加到DOM的接口和功能,以支持对上述描述的功能的运行时访问。
3.1 类型
在WebGL 2.0中引入了以下类型。
typedef long long GLint64;
typedef unsigned long long GLuint64;
3.2 WebGLQuery
WebGLQuery 类型在 WebGL 2.0 中引入。它用于查询和检索 GPU 中的信息,例如时间戳和时间间隔。
3.3 WebGLSampler
WebGLSampler 类型是 WebGL 2.0 中的一种对象,用于定义纹理采样参数,如过滤器和边缘包装模式。
3.4 WebGLSync
WebGLSync 类型用于同步 GPU 操作,它可以用于等待 GPU 完成或查询 GPU 操作是否已完成。
3.5 WebGLTransformFeedback
WebGLTransformFeedback 类型用于配置和操作变换反馈操作,允许将顶点数据传递回缓冲区,以便在 GPU 中进行后续处理。
3.6 WebGLVertexArrayObject
WebGLVertexArrayObject 类型是用于保存和管理顶点数组对象状态的对象。顶点数组对象包括顶点属性状态和元素数组缓冲区状态。
3.7 The WebGL context
The WebGL2RenderingContext 表示了允许在 canvas 元素中进行 OpenGL ES 3.0 风格渲染的 API。
typedef ([AllowShared] Uint32Array or sequence<GLuint>) Uint32List;
interface mixin WebGL2RenderingContextBase
{
const GLenum READ_BUFFER = 0x0C02;
const GLenum UNPACK_ROW_LENGTH = 0x0CF2;
const GLenum UNPACK_SKIP_ROWS = 0x0CF3;
const GLenum UNPACK_SKIP_PIXELS = 0x0CF4;
const GLenum PACK_ROW_LENGTH = 0x0D02;
const GLenum PACK_SKIP_ROWS = 0x0D03;
const GLenum PACK_SKIP_PIXELS = 0x0D04;
const GLenum COLOR = 0x1800;
const GLenum DEPTH = 0x1801;
const GLenum STENCIL = 0x1802;
const GLenum RED = 0x1903;
const GLenum RGB8 = 0x8051;
const GLenum RGBA8 = 0x8058;
const GLenum RGB10_A2 = 0x8059;
const GLenum TEXTURE_BINDING_3D = 0x806A;
const GLenum UNPACK_SKIP_IMAGES = 0x806D;
const GLenum UNPACK_IMAGE_HEIGHT = 0x806E;
const GLenum TEXTURE_3D = 0x806F;
const GLenum TEXTURE_WRAP_R = 0x8072;
const GLenum MAX_3D_TEXTURE_SIZE = 0x8073;
const GLenum UNSIGNED_INT_2_10_10_10_REV = 0x8368;
const GLenum MAX_ELEMENTS_VERTICES = 0x80E8;
const GLenum MAX_ELEMENTS_INDICES = 0x80E9;
const GLenum TEXTURE_MIN_LOD = 0x813A;
const GLenum TEXTURE_MAX_LOD = 0x813B;
const GLenum TEXTURE_BASE_LEVEL = 0x813C;
const GLenum TEXTURE_MAX_LEVEL = 0x813D;
const GLenum MIN = 0x8007;
const GLenum MAX = 0x8008;
const GLenum DEPTH_COMPONENT24 = 0x81A6;
const GLenum MAX_TEXTURE_LOD_BIAS = 0x84FD;
const GLenum TEXTURE_COMPARE_MODE = 0x884C;
const GLenum TEXTURE_COMPARE_FUNC = 0x884D;
const GLenum CURRENT_QUERY = 0x8865;
const GLenum QUERY_RESULT = 0x8866;
const GLenum QUERY_RESULT_AVAILABLE = 0x8867;
const GLenum STREAM_READ = 0x88E1;
const GLenum STREAM_COPY = 0x88E2;
const GLenum STATIC_READ = 0x88E5;
const GLenum STATIC_COPY = 0x88E6;
const GLenum DYNAMIC_READ = 0x88E9;
const GLenum DYNAMIC_COPY = 0x88EA;
const GLenum MAX_DRAW_BUFFERS = 0x8824;
const GLenum DRAW_BUFFER0 = 0x8825;
const GLenum DRAW_BUFFER1 = 0x8826;
const GLenum DRAW_BUFFER2 = 0x8827;
const GLenum DRAW_BUFFER3 = 0x8828;
const GLenum DRAW_BUFFER4 = 0x8829;
const GLenum DRAW_BUFFER5 = 0x882A;
const GLenum DRAW_BUFFER6 = 0x882B;
const GLenum DRAW_BUFFER7 = 0x882C;
const GLenum DRAW_BUFFER8 = 0x882D;
const GLenum DRAW_BUFFER9 = 0x882E;
const GLenum DRAW_BUFFER10 = 0x882F;
const GLenum DRAW_BUFFER11 = 0x8830;
const GLenum DRAW_BUFFER12 = 0x8831;
const GLenum DRAW_BUFFER13 = 0x8832;
const GLenum DRAW_BUFFER14 = 0x8833;
const GLenum DRAW_BUFFER15 = 0x8834;
const GLenum MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8B49;
const GLenum MAX_VERTEX_UNIFORM_COMPONENTS = 0x8B4A;
const GLenum SAMPLER_3D = 0x8B5F;
const GLenum SAMPLER_2D_SHADOW = 0x8B62;
const GLenum FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8B8B;
const GLenum PIXEL_PACK_BUFFER = 0x88EB;
const GLenum PIXEL_UNPACK_BUFFER = 0x88EC;
const GLenum PIXEL_PACK_BUFFER_BINDING = 0x88ED;
const GLenum PIXEL_UNPACK_BUFFER_BINDING = 0x88EF;
const GLenum FLOAT_MAT2x3 = 0x8B65;
const GLenum FLOAT_MAT2x4 = 0x8B66;
const GLenum FLOAT_MAT3x2 = 0x8B67;
const GLenum FLOAT_MAT3x4 = 0x8B68;
const GLenum FLOAT_MAT4x2 = 0x8B69;
const GLenum FLOAT_MAT4x3 = 0x8B6A;
const GLenum SRGB = 0x8C40;
const GLenum SRGB8 = 0x8C41;
const GLenum SRGB8_ALPHA8 = 0x8C43;
const GLenum COMPARE_REF_TO_TEXTURE = 0x884E;
const GLenum RGBA32F = 0x8814;
const GLenum RGB32F = 0x8815;
const GLenum RGBA16F = 0x881A;
const GLenum RGB16F = 0x881B;
const GLenum VERTEX_ATTRIB_ARRAY_INTEGER = 0x88FD;
const GLenum MAX_ARRAY_TEXTURE_LAYERS = 0x88FF;
const GLenum MIN_PROGRAM_TEXEL_OFFSET = 0x8904;
const GLenum MAX_PROGRAM_TEXEL_OFFSET = 0x8905;
const GLenum MAX_VARYING_COMPONENTS = 0x8B4B;
const GLenum TEXTURE_2D_ARRAY = 0x8C1A;
const GLenum TEXTURE_BINDING_2D_ARRAY = 0x8C1D;
const GLenum R11F_G11F_B10F = 0x8C3A;
const GLenum UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B;
const GLenum RGB9_E5 = 0x8C3D;
const GLenum UNSIGNED_INT_5_9_9_9_REV = 0x8C3E;
const GLenum TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F;
const GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80;
const GLenum TRANSFORM_FEEDBACK_VARYINGS = 0x8C83;
const GLenum TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84;
const GLenum TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85;
const GLenum TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88;
const GLenum RASTERIZER_DISCARD = 0x8C89;
const GLenum MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A;
const GLenum MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B;
const GLenum INTERLEAVED_ATTRIBS = 0x8C8C;
const GLenum SEPARATE_ATTRIBS = 0x8C8D;
const GLenum TRANSFORM_FEEDBACK_BUFFER = 0x8C8E;
const GLenum TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F;
const GLenum RGBA32UI = 0x8D70;
const GLenum RGB32UI = 0x8D71;
const GLenum RGBA16UI = 0x8D76;
const GLenum RGB16UI = 0x8D77;
const GLenum RGBA8UI = 0x8D7C;
const GLenum RGB8UI = 0x8D7D;
const GLenum RGBA32I = 0x8D82;
const GLenum RGB32I = 0x8D83;
const GLenum RGBA16I = 0x8D88;
const GLenum RGB16I = 0x8D89;
const GLenum RGBA8I = 0x8D8E;
const GLenum RGB8I = 0x8D8F;
const GLenum RED_INTEGER = 0x8D94;
const GLenum RGB_INTEGER = 0x8D98;
const GLenum RGBA_INTEGER = 0x8D99;
const GLenum SAMPLER_2D_ARRAY = 0x8DC1;
const GLenum SAMPLER_2D_ARRAY_SHADOW = 0x8DC4;
const GLenum SAMPLER_CUBE_SHADOW = 0x8DC5;
const GLenum UNSIGNED_INT_VEC2 = 0x8DC6;
const GLenum UNSIGNED_INT_VEC3 = 0x8DC7;
const GLenum UNSIGNED_INT_VEC4 = 0x8DC8;
const GLenum INT_SAMPLER_2D = 0x8DCA;
const GLenum INT_SAMPLER_3D = 0x8DCB;
const GLenum INT_SAMPLER_CUBE = 0x8DCC;
const GLenum INT_SAMPLER_2D_ARRAY = 0x8DCF;
const GLenum UNSIGNED_INT_SAMPLER_2D = 0x8DD2;
const GLenum UNSIGNED_INT_SAMPLER_3D = 0x8DD3;
const GLenum UNSIGNED_INT_SAMPLER_CUBE = 0x8DD4;
const GLenum UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7;
const GLenum DEPTH_COMPONENT32F = 0x8CAC;
const GLenum DEPTH32F_STENCIL8 = 0x8CAD;
const GLenum FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD;
const GLenum FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;
const GLenum FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;
const GLenum FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;
const GLenum FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;
const GLenum FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;
const GLenum FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;
const GLenum FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;
const GLenum FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;
const GLenum FRAMEBUFFER_DEFAULT = 0x8218;
const GLenum UNSIGNED_INT_24_8 = 0x84FA;
const GLenum DEPTH24_STENCIL8 = 0x88F0;
const GLenum UNSIGNED_NORMALIZED = 0x8C17;
const GLenum DRAW_FRAMEBUFFER_BINDING = 0x8CA6; /* Same as FRAMEBUFFER_BINDING */
const GLenum READ_FRAMEBUFFER = 0x8CA8;
const GLenum DRAW_FRAMEBUFFER = 0x8CA9;
const GLenum READ_FRAMEBUFFER_BINDING = 0x8CAA;
const GLenum RENDERBUFFER_SAMPLES = 0x8CAB;
const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8CD4;
const GLenum MAX_COLOR_ATTACHMENTS = 0x8CDF;
const GLenum COLOR_ATTACHMENT1 = 0x8CE1;
const GLenum COLOR_ATTACHMENT2 = 0x8CE2;
const GLenum COLOR_ATTACHMENT3 = 0x8CE3;
const GLenum COLOR_ATTACHMENT4 = 0x8CE4;
const GLenum COLOR_ATTACHMENT5 = 0x8CE5;
const GLenum COLOR_ATTACHMENT6 = 0x8CE6;
const GLenum COLOR_ATTACHMENT7 = 0x8CE7;
const GLenum COLOR_ATTACHMENT8 = 0x8CE8;
const GLenum COLOR_ATTACHMENT9 = 0x8CE9;
const GLenum COLOR_ATTACHMENT10 = 0x8CEA;
const GLenum COLOR_ATTACHMENT11 = 0x8CEB;
const GLenum COLOR_ATTACHMENT12 = 0x8CEC;
const GLenum COLOR_ATTACHMENT13 = 0x8CED;
const GLenum COLOR_ATTACHMENT14 = 0x8CEE;
const GLenum COLOR_ATTACHMENT15 = 0x8CEF;
const GLenum FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8D56;
const GLenum MAX_SAMPLES = 0x8D57;
const GLenum HALF_FLOAT = 0x140B;
const GLenum RG = 0x8227;
const GLenum RG_INTEGER = 0x8228;
const GLenum R8 = 0x8229;
const GLenum RG8 = 0x822B;
const GLenum R16F = 0x822D;
const GLenum R32F = 0x822E;
const GLenum RG16F = 0x822F;
const GLenum RG32F = 0x8230;
const GLenum R8I = 0x8231;
const GLenum R8UI = 0x8232;
const GLenum R16I = 0x8233;
const GLenum R16UI = 0x8234;
const GLenum R32I = 0x8235;
const GLenum R32UI = 0x8236;
const GLenum RG8I = 0x8237;
const GLenum RG8UI = 0x8238;
const GLenum RG16I = 0x8239;
const GLenum RG16UI = 0x823A;
const GLenum RG32I = 0x823B;
const GLenum RG32UI = 0x823C;
const GLenum VERTEX_ARRAY_BINDING = 0x85B5;
const GLenum R8_SNORM = 0x8F94;
const GLenum RG8_SNORM = 0x8F95;
const GLenum RGB8_SNORM = 0x8F96;
const GLenum RGBA8_SNORM = 0x8F97;
const GLenum SIGNED_NORMALIZED = 0x8F9C;
const GLenum COPY_READ_BUFFER = 0x8F36;
const GLenum COPY_WRITE_BUFFER = 0x8F37;
const GLenum COPY_READ_BUFFER_BINDING = 0x8F36; /* Same as COPY_READ_BUFFER */
const GLenum COPY_WRITE_BUFFER_BINDING = 0x8F37; /* Same as COPY_WRITE_BUFFER */
const GLenum UNIFORM_BUFFER = 0x8A11;
const GLenum UNIFORM_BUFFER_BINDING = 0x8A28;
const GLenum UNIFORM_BUFFER_START = 0x8A29;
const GLenum UNIFORM_BUFFER_SIZE = 0x8A2A;
const GLenum MAX_VERTEX_UNIFORM_BLOCKS = 0x8A2B;
const GLenum MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8A2D;
const GLenum MAX_COMBINED_UNIFORM_BLOCKS = 0x8A2E;
const GLenum MAX_UNIFORM_BUFFER_BINDINGS = 0x8A2F;
const GLenum MAX_UNIFORM_BLOCK_SIZE = 0x8A30;
const GLenum MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8A31;
const GLenum MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8A33;
const GLenum UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8A34;
const GLenum ACTIVE_UNIFORM_BLOCKS = 0x8A36;
const GLenum UNIFORM_TYPE = 0x8A37;
const GLenum UNIFORM_SIZE = 0x8A38;
const GLenum UNIFORM_BLOCK_INDEX = 0x8A3A;
const GLenum UNIFORM_OFFSET = 0x8A3B;
const GLenum UNIFORM_ARRAY_STRIDE = 0x8A3C;
const GLenum UNIFORM_MATRIX_STRIDE = 0x8A3D;
const GLenum UNIFORM_IS_ROW_MAJOR = 0x8A3E;
const GLenum UNIFORM_BLOCK_BINDING = 0x8A3F;
const GLenum UNIFORM_BLOCK_DATA_SIZE = 0x8A40;
const GLenum UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8A42;
const GLenum UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8A43;
const GLenum UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8A44;
const GLenum UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8A46;
const GLenum INVALID_INDEX = 0xFFFFFFFF;
const GLenum MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122;
const GLenum MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125;
const GLenum MAX_SERVER_WAIT_TIMEOUT = 0x9111;
const GLenum OBJECT_TYPE = 0x9112;
const GLenum SYNC_CONDITION = 0x9113;
const GLenum SYNC_STATUS = 0x9114;
const GLenum SYNC_FLAGS = 0x9115;
const GLenum SYNC_FENCE = 0x9116;
const GLenum SYNC_GPU_COMMANDS_COMPLETE = 0x9117;
const GLenum UNSIGNALED = 0x9118;
const GLenum SIGNALED = 0x9119;
const GLenum ALREADY_SIGNALED = 0x911A;
const GLenum TIMEOUT_EXPIRED = 0x911B;
const GLenum CONDITION_SATISFIED = 0x911C;
const GLenum WAIT_FAILED = 0x911D;
const GLenum SYNC_FLUSH_COMMANDS_BIT = 0x00000001;
const GLenum VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88FE;
const GLenum ANY_SAMPLES_PASSED = 0x8C2F;
const GLenum ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8D6A;
const GLenum SAMPLER_BINDING = 0x8919;
const GLenum RGB10_A2UI = 0x906F;
const GLenum INT_2_10_10_10_REV = 0x8D9F;
const GLenum TRANSFORM_FEEDBACK = 0x8E22;
const GLenum TRANSFORM_FEEDBACK_PAUSED = 0x8E23;
const GLenum TRANSFORM_FEEDBACK_ACTIVE = 0x8E24;
const GLenum TRANSFORM_FEEDBACK_BINDING = 0x8E25;
const GLenum TEXTURE_IMMUTABLE_FORMAT = 0x912F;
const GLenum MAX_ELEMENT_INDEX = 0x8D6B;
const GLenum TEXTURE_IMMUTABLE_LEVELS = 0x82DF;
const GLint64 TIMEOUT_IGNORED = -1;
/* WebGL-specific enums */
const GLenum MAX_CLIENT_WAIT_TIMEOUT_WEBGL = 0x9247;
/* Buffer objects */
undefined copyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset,
GLintptr writeOffset, GLsizeiptr size);
// MapBufferRange, in particular its read-only and write-only modes,
// can not be exposed safely to JavaScript. GetBufferSubData
// replaces it for the purpose of fetching data back from the GPU.
undefined getBufferSubData(GLenum target, GLintptr srcByteOffset, [AllowShared] ArrayBufferView dstBuffer,
optional GLuint dstOffset = 0, optional GLuint length = 0);
/* Framebuffer objects */
undefined blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0,
GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
undefined framebufferTextureLayer(GLenum target, GLenum attachment, WebGLTexture? texture, GLint level,
GLint layer);
undefined invalidateFramebuffer(GLenum target, sequence<GLenum> attachments);
undefined invalidateSubFramebuffer(GLenum target, sequence<GLenum> attachments,
GLint x, GLint y, GLsizei width, GLsizei height);
undefined readBuffer(GLenum src);
/* Renderbuffer objects */
any getInternalformatParameter(GLenum target, GLenum internalformat, GLenum pname);
undefined renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat,
GLsizei width, GLsizei height);
/* Texture objects */
undefined texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,
GLsizei height);
undefined texStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width,
GLsizei height, GLsizei depth);
undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLsizei depth, GLint border, GLenum format, GLenum type, GLintptr pboOffset);
undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLsizei depth, GLint border, GLenum format, GLenum type,
TexImageSource source); // May throw DOMException
undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData);
undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
GLuint srcOffset);
undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
GLintptr pboOffset);
undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
TexImageSource source); // May throw DOMException
undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
[AllowShared] ArrayBufferView? srcData, optional GLuint srcOffset = 0);
undefined copyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
GLint x, GLint y, GLsizei width, GLsizei height);
undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLintptr offset);
undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLsizei depth, GLint border, [AllowShared] ArrayBufferView srcData,
optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0);
undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLsizei imageSize, GLintptr offset);
undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
GLenum format, [AllowShared] ArrayBufferView srcData,
optional GLuint srcOffset = 0,
optional GLuint srcLengthOverride = 0);
/* Programs and shaders */
[WebGLHandlesContextLoss] GLint getFragDataLocation(WebGLProgram program, DOMString name);
/* Uniforms */
undefined uniform1ui(WebGLUniformLocation? location, GLuint v0);
undefined uniform2ui(WebGLUniformLocation? location, GLuint v0, GLuint v1);
undefined uniform3ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2);
undefined uniform4ui(WebGLUniformLocation? location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
undefined uniform1uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform2uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform3uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform4uiv(WebGLUniformLocation? location, Uint32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniformMatrix3x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix4x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix2x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix4x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix2x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix3x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
/* Vertex attribs */
undefined vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w);
undefined vertexAttribI4iv(GLuint index, Int32List values);
undefined vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
undefined vertexAttribI4uiv(GLuint index, Uint32List values);
undefined vertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
/* Writing to the drawing buffer */
undefined vertexAttribDivisor(GLuint index, GLuint divisor);
undefined drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
undefined drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei instanceCount);
undefined drawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLintptr offset);
/* Multiple Render Targets */
undefined drawBuffers(sequence<GLenum> buffers);
undefined clearBufferfv(GLenum buffer, GLint drawbuffer, Float32List values,
optional GLuint srcOffset = 0);
undefined clearBufferiv(GLenum buffer, GLint drawbuffer, Int32List values,
optional GLuint srcOffset = 0);
undefined clearBufferuiv(GLenum buffer, GLint drawbuffer, Uint32List values,
optional GLuint srcOffset = 0);
undefined clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
/* Query Objects */
WebGLQuery? createQuery();
undefined deleteQuery(WebGLQuery? query);
[WebGLHandlesContextLoss] GLboolean isQuery(WebGLQuery? query);
undefined beginQuery(GLenum target, WebGLQuery query);
undefined endQuery(GLenum target);
WebGLQuery? getQuery(GLenum target, GLenum pname);
any getQueryParameter(WebGLQuery query, GLenum pname);
/* Sampler Objects */
WebGLSampler? createSampler();
undefined deleteSampler(WebGLSampler? sampler);
[WebGLHandlesContextLoss] GLboolean isSampler(WebGLSampler? sampler);
undefined bindSampler(GLuint unit, WebGLSampler? sampler);
undefined samplerParameteri(WebGLSampler sampler, GLenum pname, GLint param);
undefined samplerParameterf(WebGLSampler sampler, GLenum pname, GLfloat param);
any getSamplerParameter(WebGLSampler sampler, GLenum pname);
/* Sync objects */
WebGLSync? fenceSync(GLenum condition, GLbitfield flags);
[WebGLHandlesContextLoss] GLboolean isSync(WebGLSync? sync);
undefined deleteSync(WebGLSync? sync);
GLenum clientWaitSync(WebGLSync sync, GLbitfield flags, GLuint64 timeout);
undefined waitSync(WebGLSync sync, GLbitfield flags, GLint64 timeout);
any getSyncParameter(WebGLSync sync, GLenum pname);
/* Transform Feedback */
WebGLTransformFeedback? createTransformFeedback();
undefined deleteTransformFeedback(WebGLTransformFeedback? tf);
[WebGLHandlesContextLoss] GLboolean isTransformFeedback(WebGLTransformFeedback? tf);
undefined bindTransformFeedback (GLenum target, WebGLTransformFeedback? tf);
undefined beginTransformFeedback(GLenum primitiveMode);
undefined endTransformFeedback();
undefined transformFeedbackVaryings(WebGLProgram program, sequence<DOMString> varyings, GLenum bufferMode);
WebGLActiveInfo? getTransformFeedbackVarying(WebGLProgram program, GLuint index);
undefined pauseTransformFeedback();
undefined resumeTransformFeedback();
/* Uniform Buffer Objects and Transform Feedback Buffers */
undefined bindBufferBase(GLenum target, GLuint index, WebGLBuffer? buffer);
undefined bindBufferRange(GLenum target, GLuint index, WebGLBuffer? buffer, GLintptr offset, GLsizeiptr size);
any getIndexedParameter(GLenum target, GLuint index);
sequence<GLuint>? getUniformIndices(WebGLProgram program, sequence<DOMString> uniformNames);
any getActiveUniforms(WebGLProgram program, sequence<GLuint> uniformIndices, GLenum pname);
GLuint getUniformBlockIndex(WebGLProgram program, DOMString uniformBlockName);
any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname);
DOMString? getActiveUniformBlockName(WebGLProgram program, GLuint uniformBlockIndex);
undefined uniformBlockBinding(WebGLProgram program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
/* Vertex Array Objects */
WebGLVertexArrayObject? createVertexArray();
undefined deleteVertexArray(WebGLVertexArrayObject? vertexArray);
[WebGLHandlesContextLoss] GLboolean isVertexArray(WebGLVertexArrayObject? vertexArray);
undefined bindVertexArray(WebGLVertexArrayObject? array);
};
interface mixin WebGL2RenderingContextOverloads
{
// WebGL1:
undefined bufferData(GLenum target, GLsizeiptr size, GLenum usage);
undefined bufferData(GLenum target, AllowSharedBufferSource? srcData, GLenum usage);
undefined bufferSubData(GLenum target, GLintptr dstByteOffset, AllowSharedBufferSource srcData);
// WebGL2:
undefined bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, GLuint srcOffset,
optional GLuint length = 0);
undefined bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData,
GLuint srcOffset, optional GLuint length = 0);
// WebGL1 legacy entrypoints:
undefined texImage2D(GLenum target, GLint level, GLint internalformat,
GLsizei width, GLsizei height, GLint border, GLenum format,
GLenum type, [AllowShared] ArrayBufferView? pixels);
undefined texImage2D(GLenum target, GLint level, GLint internalformat,
GLenum format, GLenum type, TexImageSource source); // May throw DOMException
undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height,
GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLenum format, GLenum type, TexImageSource source); // May throw DOMException
// WebGL2 entrypoints:
undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type, GLintptr pboOffset);
undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type,
TexImageSource source); // May throw DOMException
undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
GLuint srcOffset);
undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
GLsizei height, GLenum format, GLenum type, GLintptr pboOffset);
undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
GLsizei height, GLenum format, GLenum type,
TexImageSource source); // May throw DOMException
undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData,
GLuint srcOffset);
undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLint border, GLsizei imageSize, GLintptr offset);
undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLint border, [AllowShared] ArrayBufferView srcData,
optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0);
undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLintptr offset);
undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height, GLenum format,
[AllowShared] ArrayBufferView srcData,
optional GLuint srcOffset = 0,
optional GLuint srcLengthOverride = 0);
undefined uniform1fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform2fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform3fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform4fv(WebGLUniformLocation? location, Float32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform1iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform2iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform3iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniform4iv(WebGLUniformLocation? location, Int32List data, optional GLuint srcOffset = 0,
optional GLuint srcLength = 0);
undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data,
optional GLuint srcOffset = 0, optional GLuint srcLength = 0);
/* Reading back pixels */
// WebGL1:
undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
[AllowShared] ArrayBufferView? dstData);
// WebGL2:
undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
GLintptr offset);
undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
[AllowShared] ArrayBufferView dstData, GLuint dstOffset);
};
[Exposed=(Window,Worker)]
interface WebGL2RenderingContext
{
};
WebGL2RenderingContext includes WebGLRenderingContextBase;
WebGL2RenderingContext includes WebGL2RenderingContextBase;
WebGL2RenderingContext includes WebGL2RenderingContextOverloads;
3.7.1 更多绑定点
在 WebGL 2.0 中,引入了更多的绑定点,包括用于统一变量缓冲区、像素解包缓冲区等的绑定点。
1.void bindBuffer(GLenum target, WebGLBuffer? buffer) (OpenGL ES 3.0.6 §2.10.1, man page)
-
将给定的 WebGLBuffer 对象绑定到给定的绑定点(目标)。target 的取值如下表所示:
target ARRAY_BUFFER COPY_READ_BUFFER COPY_WRITE_BUFFER ELEMENT_ARRAY_BUFFER PIXEL_PACK_BUFFER PIXEL_UNPACK_BUFFER TRANSFORM_FEEDBACK_BUFFER UNIFORM_BUFFER 如果 target 不在上述表格中的取值范围内,则会生成一个
INVALID_ENUM错误。
请参阅 Buffer Object Binding 的内容
2.void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer) (OpenGL ES 3.0.6 §4.4.1, man page)
-
将给定的 WebGLFramebuffer 对象绑定到给定的绑定点(目标)。target 的取值如下表所示:
target FRAMEBUFFER READ_FRAMEBUFFER DRAW_FRAMEBUFFER
如果 target 不在上述表格中的取值范围内,则会生成一个 INVALID_ENUM 错误。
3.void bindTexture(GLenum target, WebGLTexture? texture) (OpenGL ES 3.0.6 §3.8.1, man page)
-
将给定的 WebGLTexture 对象绑定到给定的绑定点(目标)。target 的取值如下表所示:
target TEXTURE_2D TEXTURE_3D TEXTURE_2D_ARRAY TEXTURE_CUBE_MAP
如果 target 不在上述表格中的取值范围内,则会生成一个 INVALID_ENUM 错误。
3.7.2 设置和获取状态
描述了如何设置和获取 WebGL 上下文的状态,包括启用/禁用功能、设置清除颜色等。
1.[any getParameter]()(GLenum pname) (OpenGL ES 3.0.6 §6.1.1, glGet OpenGL ES 3.0 man page, glGetString OpenGL ES 3.0 man page)
-
返回传递的 pname 所对应的值。除了支持 WebGL 1.0 中的所有 pname/type 值外,还支持以下参数:
pname returned type 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
所有返回序列或类型数组的查询每次都会返回一个新的对象。
如果 pname 不在上述表格中,并且也不是 WebGL 1.0 支持的参数名称之一,将会生成一个 INVALID_ENUM 错误,并返回 null。
以下的 pname 参数返回一个描述当前 WebGL 实现某个方面的字符串:
-
VERSION Returns a version or release number of the form WebGL<space>2.0<optional><space><vendor-specific information></optional>.SHADING_LANGUAGE_VERSION Returns a version or release number of the form WebGL<space>GLSL<space>ES<space>3.00<optional><space><vendor-specific information></optional>.对于
RED_BITS、GREEN_BITS、BLUE_BITS和ALPHA_BITS,如果绘制帧缓冲区的活动颜色附件具有不同的格式,将生成一个INVALID_OPERATION错误并返回 0。
2.any getIndexedParameter(GLenum target, GLuint index) (OpenGL ES 3.0.6 §6.1.1, glGet OpenGL ES 3.0 man page)
-
返回传递的
target的索引值。返回的类型是请求的pname的自然类型,如下表所示:target returned type 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。
3.[GLboolean isEnabled]()(GLenum cap) (OpenGL ES 3.0.6 §6.1.1, OpenGL ES 3.0 man page)
- 除了来自 WebGL 1.0 的所有
cap值外,还支持 RASTERIZER_DISCARD。
4. void pixelStorei(GLenum pname, GLint param) (OpenGL ES 3.0.6 §3.7.1, OpenGL ES 3.0 man page)
-
除了来自 WebGL 1.0 的参数外,WebGL 2.0 规范还接受以下额外的参数:
pname PACK_ROW_LENGTH PACK_SKIP_PIXELS PACK_SKIP_ROWS UNPACK_ROW_LENGTH UNPACK_IMAGE_HEIGHT UNPACK_SKIP_PIXELS UNPACK_SKIP_ROWS UNPACK_SKIP_IMAGES
3.7.3 缓冲对象
描述了在 WebGL 中如何操作缓冲对象,包括创建、绑定、写入数据等操作。
1. void bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, GLuint srcOffset, optional GLuint length = 0);(OpenGL ES 3.0.6 §2.10.2, man page)
-
设置当前绑定的 WebGLBuffer 对象的大小,然后将
srcData的子区域复制到缓冲区对象。让
buf为绑定到target的缓冲区。
如果 length 为 0:
- 若
srcData为DataView,让copyLength为srcData.byteLength - srcOffset;下文中的类型元素是字节。 - 否则,让
copyLength为srcData.length - srcOffset。
否则,让 copyLength 为 length。
-
如果
srcData为DataView,将buf的大小设置为copyLength;否则,将buf的大小设置为copyLength * srcData.BYTES_PER_ELEMENT。 -
如果
srcData为DataView,让elementSize为 1;否则,让elementSize为srcData.BYTES_PER_ELEMENT。 -
若
copyLength大于零,将srcData中从元素索引srcOffset开始读取的copyLength个类型元素(每个大小为elementSize)复制到buf,如果copyLength为 0,则不向buf写入数据,但这不会引发 GL 错误。 -
若没有 WebGLBuffer 绑定到
target,生成INVALID_OPERATION错误。 -
若
srcOffset大于srcData.length(或DataView的srcData.byteLength),生成INVALID_VALUE错误。 -
若
srcOffset + copyLength大于srcData.length(或DataView的srcData.byteLength),生成INVALID_VALUE错误。
若生成任何错误,buf 的大小保持不变,且不会向其写入数据。
2. void bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData, GLuint srcOffset, optional GLuint length = 0); (OpenGL ES 3.0.6 §2.10.2, man page)
-
将
srcData的子区域复制到当前绑定的 WebGLBuffer 对象。让
buf成为绑定到target的缓冲区。
如果 length 为 0:
- 如果
srcData是一个DataView,那么copyLength为srcData.byteLength - srcOffset;以下文中的数据类型元素是字节。 - 否则,让
copyLength为srcData.length - srcOffset。
否则,让 copyLength 为 length。
如果 srcData 是一个 DataView,将 buf 的大小设置为 copyLength;否则,将 buf 的大小设置为 copyLength * srcData.BYTES_PER_ELEMENT。
如果 srcData 是一个 DataView,让 elementSize 为 1;否则,让 elementSize 为 srcData.BYTES_PER_ELEMENT。
如果 copyLength 大于零,则将 srcData 中从元素索引 srcOffset 开始的 copyLength 个数据(每个大小为 elementSize)复制到 buf,写入从字节偏移 dstByteOffset 开始的位置。如果 copyLength 为 0,则不向 buf 写入数据,但这不会引发 GL 错误。
- 如果没有 WebGLBuffer 绑定到
target,会生成INVALID_OPERATION错误。 - 如果
dstByteOffset小于零,则会生成INVALID_VALUE错误。 - 如果
dstByteOffset + copyByteLength大于buf的大小,则会生成INVALID_VALUE错误。 - 如果
srcOffset大于srcData.length(对于DataView而言是srcData.byteLength),则会生成INVALID_VALUE错误。 - 如果
srcOffset + copyLength大于srcData.length(对于DataView而言是srcData.byteLength),则会生成INVALID_VALUE错误。
如果生成了任何错误,则不会向 buf 写入数据。
3. any getBufferParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.9, man page)
- 返回传递的 pname 的值。除了支持查询 pname 为 BUFFER_USAGE(与 WebGL 1.0 中相同),查询 pname 为 BUFFER_SIZE 将以类型为 GLsizeiptr 的值返回缓冲区的大小。
4.void copyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) (OpenGL ES 3.0.6 §2.10.5, man page)
- 将绑定到 readTarget 的缓冲区的一部分数据复制到绑定到 writeTarget 的缓冲区中。请参阅复制缓冲区以获取 WebGL 2.0 API 强加的限制。
5 undefined getBufferSubData(GLenum target, GLintptr srcByteOffset, [AllowShared] ArrayBufferView dstBuffer, optional GLuint dstOffset = 0, optional GLuint length = 0)
-
从绑定到 WebGLBuffer 的缓冲区中读取数据并写入到
dstBuffer中。让
buf为绑定到target的缓冲区。如果
length为 0:- 如果
dstBuffer是一个DataView,则令copyLength为dstBuffer.byteLength - dstOffset;下文中的类型元素是以字节为单位的。 - 否则,令
copyLength为dstBuffer.length - dstOffset。
否则,令
copyLength为length。如果
dstBuffer是一个DataView,则令copyByteLength为copyLength;否则,令copyByteLength为copyLength * dstBuffer.BYTES_PER_ELEMENT。如果
dstBuffer是一个DataView,则令elementSize为 1;否则,令elementSize为dstBuffer.BYTES_PER_ELEMENT。如果
copyLength大于零,从buf中复制copyLength个类型元素(每个大小为elementSize)到dstBuffer中,从buf中以字节索引srcByteOffset开始读取,从dstBuffer中以元素索引dstOffset开始写入。如果copyLength为 0,则不会向dstBuffer写入数据,但这不会导致生成 GL 错误。- 如果没有 WebGLBuffer 绑定到
target,则生成一个INVALID_OPERATION错误。 - 如果
target是TRANSFORM_FEEDBACK_BUFFER,并且当前有任何变换反馈对象处于活动状态,则生成一个INVALID_OPERATION错误。 - 如果
dstOffset大于dstBuffer.length(或dstBuffer.byteLength在DataView的情况下),则生成一个INVALID_VALUE错误。 - 如果
dstOffset + copyLength大于dstBuffer.length(或dstBuffer.byteLength在DataView的情况下),则生成一个INVALID_VALUE错误。 - 如果
srcByteOffset小于零,则生成一个INVALID_VALUE错误。 - 如果
srcByteOffset + copyByteLength大于buf的大小,则生成一个INVALID_OPERATION错误。
如果产生任何错误,不会向
dstBuffer写入数据。如果缓冲区被其他操作和
getBufferSubData顺序写入和读取,WebGL API有责任确保数据被一致地访问。即使缓冲区当前绑定到变换反馈绑定点,此规则也适用。 - 如果
这是一个阻塞操作,因为WebGL必须完全完成对源缓冲区的所有先前写操作,以便返回结果。在多进程的WebGL实现中,
getBufferSubData也可能会产生昂贵的进程间往返开销,以从远程进程获取结果。 用户可以通过发出从缓冲区读回的意图来避免这些成本:
- 在写入源缓冲区后插入
fenceSync,并在执行getBufferSubData操作之前等待它通过。- 如果要将缓冲区用作读回源,可以使用
_READ使用提示来分配缓冲区。(避免过多地使用使用_READ使用提示分配的缓冲区,因为它们可能会在维护缓冲区数据的阴影副本方面产生开销。)
3.7.4 帧缓冲对象
介绍了帧缓冲对象的概念和操作,包括创建、绑定、附加颜色和深度缓冲等。
1.[WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target) (OpenGL ES 3.0.6 §4.4.4.2, man page)
-
与 WebGL 1.0 中的
checkFramebufferStatus的唯一不同之处在此处描述。 -
target 必须是
DRAW_FRAMEBUFFER、READ_FRAMEBUFFER或FRAMEBUFFER。FRAMEBUFFER等效于DRAW_FRAMEBUFFER。 -
如果深度和模板附件(如果存在)不是相同的图像,则返回
FRAMEBUFFER_UNSUPPORTED。详细讨论请参见 Framebuffer Object Attachments。 -
如果附加的渲染缓冲区中的
RENDERBUFFER_SAMPLES的值不同,或者如果附加的图像是渲染缓冲区和纹理的混合并且非零,则返回FRAMEBUFFER_INCOMPLETE_MULTISAMPLE。 -
如果附加的图像的宽度、高度和深度(对于3D纹理)或数组大小(对于2D数组纹理)不同,则返回
FRAMEBUFFER_INCOMPLETE_DIMENSIONS。参见 checkFramebufferStatus may return FRAMEBUFFER_INCOMPLETE_DIMENSIONS。 -
如果相同的图像附加到多个颜色附件点,则返回
FRAMEBUFFER_UNSUPPORTED。参见 Framebuffer color attachments。
2.any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, GLenum pname) (OpenGL ES 3.0.6 §6.1.13, similar to glGetFramebufferAttachmentParameteriv)
-
根据传递的目标和附件,返回给定的 pname 的值。返回的类型是请求的 pname 的自然类型,如下表所示:
pname returned type FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE GLint FRAMEBUFFER_ATTACHMENT_BLUE_SIZE GLint FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING GLenum FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE GLenum FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE GLint FRAMEBUFFER_ATTACHMENT_GREEN_SIZE GLint FRAMEBUFFER_ATTACHMENT_OBJECT_NAME WebGLRenderbuffer or WebGLTexture FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE GLenum FRAMEBUFFER_ATTACHMENT_RED_SIZE GLint FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE GLint FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE GLint FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER GLint FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL GLint -
如果 pname 不在上述表格中,将生成一个
INVALID_ENUM错误。 -
如果生成了一个 OpenGL 错误,返回 null。
-
如果 attachment 是
DEPTH_STENCIL_ATTACHMENT并且不同的图像附加到深度和模板附件点,将生成一个INVALID_OPERATION错误。详细讨论请参阅帧缓冲对象附件。
3.void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) (OpenGL ES 3.0.6 §4.3.3, man page)
- 同时是一个[读取操作]和一个[绘制操作]。
- 将像素值的矩形从读取帧缓冲的一个区域传输到绘制帧缓冲的另一个区域。如果读取帧缓冲的 SAMPLE_BUFFERS 的值为 1,而绘制帧缓冲的 SAMPLE_BUFFERS 的值为 0,则会将源中每个像素位置对应的样本转换为单个样本,然后写入目标帧缓冲。
- 任何中心对应于源缓冲区之外点的目标像素保持不变。
- 当传输到 WebGL 上下文默认后备缓冲的颜色附件时,以
alpha:false创建的上下文被视为具有内部格式RGB8,而以alpha:true创建的上下文被视为具有内部格式RGBA8。 - 如果此函数尝试传输到完整帧缓冲的丢失附件,那么不会传输到该附件,并且不会生成错误,参考对丢失附件进行绘制。
- 如果此函数尝试从完整帧缓冲的丢失附件读取,并且至少有一个绘制缓冲区具有要传输的图像,将生成一个
INVALID_OPERATION错误,参考从丢失附件读取。
4.void framebufferTextureLayer(GLenum target, GLenum attachment, WebGLTexture? texture, GLint level, GLint layer) (OpenGL ES 3.0.6 §4.4.2.4, man page)
- 如果
texture是由不同的WebGL2RenderingContext创建的,会生成一个INVALID_OPERATION错误。
5.void invalidateFramebuffer(GLenum target, sequence<GLenum> attachments) (OpenGL ES 3.0.6 §4.5, man page)
- 一个[绘制操作]。
- 等效于调用
invalidateSubFramebuffer,将x和y设置为 0,将width和height设置为最大帧缓冲对象附件的宽度和高度。
6.void invalidateSubFramebuffer (GLenum target, sequence<GLenum> attachments, GLint x, GLint y, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.5, man page)
- 一个[绘制操作]。
- 向 GL 发送信号,无需保留绑定的帧缓冲对象的所有内容。
7.void readBuffer(GLenum src) (OpenGL ES 3.0.6 §4.3.1, man page)
- 将读取帧缓冲区的一个颜色缓冲指定为读取缓冲区。
3.7.5 渲染缓冲对象
描述了渲染缓冲对象的作用和操作,用于存储深度、模板等渲染数据。
1.any getInternalformatParameter(GLenum target, GLenum internalformat, GLenum pname) (OpenGL ES 3.0.6 §6.1.15, man page)
-
返回给定目标和内部格式的传递pname的值。返回的类型在以下表格中给出:
pname returned type SAMPLES Int32Array 如果pname不在上述表格中,会生成一个
INVALID_ENUM错误。如果生成了OpenGL错误,则返回null。
每次查询SAMPLES都会返回一个新的类型化数组对象实例。
2 any getRenderbufferParameter(GLenum target, GLenum pname) (OpenGL ES 2.0 §6.1.14, similar to glGetRenderbufferParameteriv)
-
根据传入的pname和target返回对应的值。返回的类型是请求的pname的自然类型,如下表所示:
pname returned type 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。
3.void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.4.2.1, man page)
4.void renderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §4.4.2.1, man page)
当internalFormat == DEPTH_STENCIL且samples > 0时,会生成INVALID_OPERATION错误。
3.7.6 纹理对象
介绍了纹理对象的创建、绑定和操作,包括设置纹理参数、加载图像数据等。
1.any getTexParameter(GLenum target, GLenum pname) (OpenGL ES 3.0.6 §6.1.3, man page)
-
返回给定目标的传递的
pname的值。返回的类型是请求的pname在以下表格中给出的自然类型:pname returned type 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错误。如果尝试在没有绑定WebGL纹理的情况下调用此函数(参见上文),则会生成一个
INVALID_OPERATION错误。如果生成OpenGL错误,则返回null。
2.void texParameterf(GLenum target, GLenum pname, GLfloat param) (OpenGL ES 3.0.6 §3.8.7, man page)
-
根据给定的目标设置传递的pname的值。pname如下表所示:
pname TEXTURE_BASE_LEVEL TEXTURE_COMPARE_FUNC TEXTURE_COMPARE_MODE TEXTURE_MAG_FILTER TEXTURE_MAX_LEVEL TEXTURE_MAX_LOD TEXTURE_MIN_FILTER TEXTURE_MIN_LOD TEXTURE_WRAP_R TEXTURE_WRAP_S TEXTURE_WRAP_T 如果pname不在上述表格中,会产生一个
INVALID_ENUM错误。如果尝试在没有绑定WebGLTexture的情况下调用此函数(见上文),会产生一个
INVALID_OPERATION错误。
3.void texParameteri(GLenum target, GLenum pname, GLint param) (OpenGL ES 3.0.6 §3.8.7, man page)
-
根据传递的pname和目标设置值。pname与上面表格中的texParameterf相同。
如果pname不在上述表格中,会产生一个
INVALID_ENUM错误。如果尝试在没有绑定WebGLTexture的情况下调用此函数(见上文),会产生一个
INVALID_OPERATION错误。
4.void texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §3.8.4, man page)
-
同时指定二维或立方体贴图的所有级别。
图像内容的设置方式就好像在OpenGL ES 3.0规范的第3.8.4节的伪代码中,每个
texImage2D(或用于压缩格式的compressedTexImage2D)调用都会传递一个足够大且初始化为0的缓冲区。
texStorage2D应被视为对texImage2D的首选替代方法。在某些实现中,它可能比texImage2D具有更低的内存成本。
5.[void texStorage3D]()(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) (OpenGL ES 3.0.6 §3.8.4, man page)
-
指定三维纹理或二维数组纹理的所有级别。
图像内容的设置方式就好像在OpenGL ES 3.0规范的第3.8.4节的伪代码中,每个
texImage3D(或用于压缩格式的compressedTexImage3D)调用都会传递一个足够大且初始化为0的缓冲区。
6.undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset) (OpenGL ES 3.0.6 §3.8.3, man page)
-
与WebGL 1.0中的texImage2D相比,唯一的不同之处在于此处描述。
如果一个WebGLBuffer被绑定到
PIXEL_UNPACK_BUFFER目标,将生成一个INVALID_OPERATION错误。在WebGL 2.0中支持大小限定的内部格式,internalformat不再需要与format相同。相反,internalformat、format和type的组合必须在man page中的表1或表2中列出。
如果type被指定为
FLOAT_32_UNSIGNED_INT_24_8_REV,则srcData必须为null;否则,将生成一个INVALID_OPERATION错误。srcData的类型必须与以下表格中的type匹配;否则,将生成一个
INVALID_OPERATION错误:type of srcData type Int8Array BYTE Uint8Array UNSIGNED_BYTE Uint8ClampedArray UNSIGNED_BYTE Int16Array SHORT Uint16Array UNSIGNED_SHORT Uint16Array UNSIGNED_SHORT_5_6_5 Uint16Array UNSIGNED_SHORT_5_5_5_1 Uint16Array UNSIGNED_SHORT_4_4_4_4 Int32Array INT Uint32Array UNSIGNED_INT Uint32Array UNSIGNED_INT_5_9_9_9_REV Uint32Array UNSIGNED_INT_2_10_10_10_REV Uint32Array UNSIGNED_INT_10F_11F_11F_REV Uint32Array UNSIGNED_INT_24_8 Uint16Array HALF_FLOAT Float32Array FLOAT -
如果未满足pixel store parameter constraints,将生成一个
INVALID_OPERATION错误。 -
从
srcData的第srcOffset个元素开始进行读取。(对于Uint8Array,元素是字节;对于Int32Array,元素是32位整数等等。) -
如果在从
srcData的srcOffset开始的位置没有足够的数据,将生成一个INVALID_OPERATION错误。
7.[throws] undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.3, man page)
-
仅与WebGL 1.0中的texImage2D有所不同的部分在这里进行描述。
对于在WebGL 2.0中引入的新格式,按照以下表格进行转换。
Source DOM Image Format Target WebGL Format RED RG Grayscale (1 channel) R = sourceGray R = sourceGray G = 0 Grayscale + Alpha (2 channels) R = sourceGray R = sourceGray G = 0 Color (3 channels) Color + Alpha (4 channels) R = sourceRed R = sourceRed G = sourceGreen
上传元素的子区域的详细信息可以在从TexImageSource上传的像素存储参数中找到。
如果一个WebGLBuffer绑定到PIXEL_UNPACK_BUFFER目标上,会生成一个INVALID_OPERATION错误。
在WebGL 2.0中支持大小化的内部格式,并且不再要求internalformat必须与format相同。相反,internalformat、format和type的组合必须在以下表格中列出:
| Internal Format | Format | Type |
|---|---|---|
| RGB | RGB | UNSIGNED_BYTE UNSIGNED_SHORT_5_6_5 |
| RGBA | RGBA | UNSIGNED_BYTE, UNSIGNED_SHORT_4_4_4_4 UNSIGNED_SHORT_5_5_5_1 |
| LUMINANCE_ALPHA | LUMINANCE_ALPHA | UNSIGNED_BYTE |
| LUMINANCE | LUMINANCE | UNSIGNED_BYTE |
| ALPHA | ALPHA | UNSIGNED_BYTE |
| R8 | RED | UNSIGNED_BYTE |
| R16F | RED | HALF_FLOAT FLOAT |
| R32F | RED | FLOAT |
| R8UI | RED_INTEGER | UNSIGNED_BYTE |
| RG8 | RG | UNSIGNED_BYTE |
| RG16F | RG | HALF_FLOAT FLOAT |
| RG32F | RG | FLOAT |
| RG8UI | RG_INTEGER | UNSIGNED_BYTE |
| RGB8 | RGB | UNSIGNED_BYTE |
| SRGB8 | RGB | UNSIGNED_BYTE |
| RGB565 | RGB | UNSIGNED_BYTE UNSIGNED_SHORT_5_6_5 |
| R11F_G11F_B10F | RGB | UNSIGNED_INT_10F_11F_11F_REV HALF_FLOAT FLOAT |
| RGB9_E5 | RGB | HALF_FLOAT FLOAT |
| RGB16F | RGB | HALF_FLOAT FLOAT |
| RGB32F | RGB | FLOAT |
| RGB8UI | RGB_INTEGER | UNSIGNED_BYTE |
| RGBA8 | RGBA | UNSIGNED_BYTE |
| SRGB8_ALPHA8 | RGBA | UNSIGNED_BYTE |
| RGB5_A1 | RGBA | UNSIGNED_BYTE UNSIGNED_SHORT_5_5_5_1 |
| RGB10_A2 | RGBA | UNSIGNED_INT_2_10_10_10_REV |
| RGBA4 | RGBA | UNSIGNED_BYTE UNSIGNED_SHORT_4_4_4_4 |
| RGBA16F | RGBA | HALF_FLOAT FLOAT |
| RGBA32F | RGBA | FLOAT |
| RGBA8UI | RGBA_INTEGER | UNSIGNED_BYTE |
当数据源是DOM元素(
HTMLImageElement、HTMLCanvasElement或HTMLVideoElement),或者是ImageBitmap、ImageData或OffscreenCanvas对象时,通常每个通道的表示都是至少8位的无符号整数类型。将这种表示转换为带有更多位的有符号整数或无符号整数并不清楚定义。例如,将RGBA8转换为RGBA16UI时,不清楚是否意图将值缩放到16位无符号整数的完整范围内。因此,只允许转换为最多8位的无符号整数、半浮点数或浮点数。
7.[void texImage2D]()(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.3, man page)
-
从绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer上传数据到当前绑定的WebGLTexture。offset是WebGLBuffer数据存储的字节偏移量;如果小于0,则生成
INVALID_VALUE错误。format、type和WebGLTexture的内部格式的组合必须在man页面的表1或表2中列出。
如果尝试在没有绑定WebGLTexture的情况下调用该函数,将生成
INVALID_OPERATION错误。如果没有将任何WebGLBuffer绑定到
PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。如果不满足pixel store参数限制,将生成
INVALID_OPERATION错误。
8.[undefined texSubImage2D]()(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset) (OpenGL ES 3.0.6 §3.8.5, man page)
-
与WebGL 1.0中的texSubImage2D相比,唯一的区别在这里描述:
如果绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。format、type和WebGLTexture的内部格式的组合必须在man页面的表1或表2中列出。
srcData的类型必须根据上述表格与type匹配,否则将生成
INVALID_OPERATION错误。请参阅像素存储参数,这些参数会影响此函数的行为。
如果不满足pixel store参数限制,将生成
INVALID_OPERATION错误。从
srcData开始读取的位置是在srcOffset元素处(对于Uint8Array是字节,对于Int32Array是int32等)。如果从srcOffset开始的
srcData中没有足够的数据,将生成INVALID_OPERATION错误。
9.[undefined texSubImage2D]()(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.5, man page)
-
与WebGL 1.0中的texSubImage2D相比,唯一的区别在这里描述:
上传元素的子区域在从
TexImageSource上传的像素存储参数中有详细说明。如果绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。format、type和WebGLTexture的内部格式的组合必须在这个表格中列出。
10.[undefined texSubImage2D]()(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.5, man page)
-
从绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer更新当前绑定的WebGLTexture的子矩形,使用来自WebGLBuffer的数据。offset是进入WebGLBuffer数据存储的字节偏移量;如果小于0,将生成
INVALID_VALUE错误。如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成
INVALID_OPERATION错误。如果没有绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。如果不满足像素存储参数约束,将生成
INVALID_OPERATION错误。
11.void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData)
12. void texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset) (OpenGL ES 3.0.6 §3.8.3, man page)
-
为三维或二维数组纹理分配并初始化指定的mipmap级别。
-
如果绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer,将生成INVALID_OPERATION错误。 -
如果
srcData为空,将传递一个足够大小且初始化为0的缓冲区。 -
internalformat、format和type的组合必须在man页面的表1或表2中列出。
-
如果type指定为
FLOAT_32_UNSIGNED_INT_24_8_REV,则srcData必须为null;否则,将生成INVALID_OPERATION错误。 -
如果srcData非空,则其类型必须根据上述表匹配type;否则,将生成
INVALID_OPERATION错误。 -
如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成
INVALID_OPERATION错误。 -
有关影响此函数行为的WebGL特定像素存储参数,请参阅像素存储参数。
-
如果不满足像素存储参数约束,将生成
INVALID_OPERATION错误。 -
从
srcData开始读取从srcOffset元素开始。(对于Uint8Array是字节,对于Int32Array是int32等) -
如果从
srcData的srcOffset开始没有足够的数据,将生成INVALID_OPERATION错误。 -
建议使用texStorage3D来代替texImage3D分配三维纹理。在某些实现中,与texStorage3D相比,texImage3D可能会产生更高的内存成本。
-
13.undefined texImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.3, man page)
-
更新当前绑定的WebGLTexture的矩形子区域。
有关上传元素的子区域的详细信息,请参阅从TexImageSource上传的像素存储参数。
有关format和type参数的解释,请参见texImage2D,以及关于
UNPACK_PREMULTIPLY_ALPHA_WEBGL像素存储参数的说明。有关影响调用此函数时以除
ImageBitmap外的任何参数类型调用时的行为的WebGL特定像素存储参数,请参阅像素存储参数。从源传输到WebGL实现的第一个像素对应于源的左上角。这个行为可以通过
UNPACK_FLIP_Y_WEBGL像素存储参数进行修改,除了ImageBitmap参数,如上述部分所述。format、type和WebGLTexture的内部格式的组合必须在此表中列出。
如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成
INVALID_OPERATION错误。如果绑定到
PIXEL_UNPACK_BUFFER目标的是WebGLBuffer,则会生成INVALID_OPERATION错误。如果使用一个被中和的
ImageData调用此函数,将生成INVALID_VALUE错误。如果使用一个被中和的
ImageBitmap调用此函数,将生成INVALID_VALUE错误。如果使用源与包含文档的源不同的
HTMLImageElement或HTMLVideoElement,或者使用设置了*origin-clean*标志为false的HTMLCanvasElement、ImageBitmap或OffscreenCanvas,则必须抛出SECURITY_ERR异常。请参阅源限制。
14.[void texImage3D]()(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.3, man page)
-
将数据从绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer上传到当前绑定的WebGLTexture中。offset是字节偏移量,指向WebGLBuffer的数据存储区;如果它小于0,则生成
INVALID_VALUE错误。如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成
INVALID_OPERATION错误。如果没有将WebGLBuffer绑定到
PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。如果不满足pixel store参数约束,将生成
INVALID_OPERATION错误。
15.undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData, optional GLuint srcOffset = 0) (OpenGL ES 3.0.6 §3.8.5, man page)
-
更新当前绑定的WebGLTexture的矩形子区域。
如果尝试在没有绑定WebGLTexture的情况下调用此函数,将生成
INVALID_OPERATION错误。如果将WebGLBuffer绑定到
PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。format、type和WebGLTexture的内部格式的组合必须列在man页面的表1或表2中。
如果type为
FLOAT_32_UNSIGNED_INT_24_8_REV,将生成INVALID_ENUM错误。srcData的类型必须与上述表格中的type匹配;否则,将生成
INVALID_OPERATION错误。如果srcData非空但其大小小于所需的width、height、depth、format、type和像素存储参数,则将生成
INVALID_OPERATION错误。有关影响此函数行为的WebGL特定像素存储参数,请参见像素存储参数。
如果不满足pixel store参数约束,将生成
INVALID_OPERATION错误。从
srcData开始读取的位置为从srcOffset开始的元素(对于Uint8Array来说是字节,对于Int32Array来说是int32)。如果在
srcData中从srcOffset开始没有足够的数据,将生成INVALID_OPERATION错误。
16.undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, TexImageSource source) // May throw DOMException (OpenGL ES 3.0.6 §3.8.5, man page)
-
更新当前绑定的WebGLTexture的矩形子区域。
关于上传元素的子区域的详细信息,请参阅从TexImageSource上传的像素存储参数。
关于format和type参数的解释以及关于
UNPACK_PREMULTIPLY_ALPHA_WEBGL像素存储参数的注释,请参见texImage2D。有关调用此函数时调用参数类型为
ImageBitmap以外的情况下影响函数行为的WebGL特定像素存储参数,请参见像素存储参数。从源传输到WebGL实现的第一个像素对应于源的左上角。这种行为由
UNPACK_FLIP_Y_WEBGL像素存储参数修改,除了ImageBitmap参数之外,正如上面所述的部分所述。format、type和WebGLTexture的内部格式的组合必须列在此表格中。
如果尝试在没有绑定WebGLTexture的情况下调用此函数(请参见上文),将生成
INVALID_OPERATION错误。如果将WebGLBuffer绑定到
PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。如果使用已中和的
ImageData调用此函数,将生成INVALID_VALUE错误。如果使用已中和的
ImageBitmap调用此函数,将生成INVALID_VALUE错误。如果使用的
HTMLImageElement或HTMLVideoElement的源与包含文档的源不同,或者使用的HTMLCanvasElement、ImageBitmap或OffscreenCanvas的位图的origin-clean标志设置为false,将抛出SECURITY_ERR异常。请参阅源限制。
17.[void texSubImage3D]()(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLintptr offset) (OpenGL ES 3.0.6 §3.8.5, man page)
-
使用来自绑定到
PIXEL_UNPACK_BUFFER目标的WebGLBuffer的数据更新当前绑定的WebGLTexture的子矩形。offset是进入WebGLBuffer数据存储的字节偏移量;如果小于0,则会生成
INVALID_VALUE错误。如果尝试在没有绑定WebGLTexture的情况下调用该函数,则会生成
INVALID_OPERATION错误。如果没有将WebGLBuffer绑定到
PIXEL_UNPACK_BUFFER目标,则会生成INVALID_OPERATION错误。如果未满足像素存储参数约束,则会生成
INVALID_OPERATION错误。
18.void copyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) (OpenGL ES 3.0.6 §3.8.5, man page)
-
这是一个[读取操作]。如果尝试在未绑定WebGL纹理的情况下调用此函数(请参见上文),将会生成一个
INVALID_OPERATION错误。对于位于帧缓冲区之外的任何像素,对应的目标像素将保持不变;详见在帧缓冲区之外读取像素。
如果此函数尝试从完整帧缓冲区的缺失附件中读取数据,将会生成一个
INVALID_OPERATION错误,参考从缺失附件中读取数据。
19. undefined compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)
-
从
srcData中读取数据开始于srcOffset元素位置(对于Uint8Array为字节,对于Int32Array为int32等)。如果
srcOffset>srcData.length,将生成INVALID_VALUE错误。srcLengthOverride默认为srcData.length - srcOffset。如果在
srcData中从srcOffset开始的数据量不足,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,则会生成INVALID_VALUE错误。
20.undefined compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)
-
从
srcData中读取数据开始于srcOffset元素位置(对于Uint8Array,元素为字节;对于Int32Array等类型,元素为int32等)。如果
srcOffset>srcData.length,将生成INVALID_VALUE错误。srcLengthOverride默认为srcData.length - srcOffset。如果在
srcData中从srcOffset开始的数据量不足,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,将生成INVALID_VALUE错误。
21.undefined compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)
-
从
srcData中读取数据,从srcOffset元素开始(对于Uint8Array,元素是字节;对于Int32Array等类型,元素是int32等)。如果
srcOffset大于srcData.length,将生成INVALID_VALUE错误。srcLengthOverride默认为srcData.length - srcOffset。如果从
srcOffset开始的srcData中没有足够的数据,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,将生成INVALID_VALUE错误。
22.undefined compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, [AllowShared] ArrayBufferView srcData, optional GLuint srcOffset = 0, optional GLuint srcLengthOverride = 0) (OpenGL ES 3.0.6 §3.8.6, man page)
-
从
srcData中读取数据,从srcOffset元素开始(对于Uint8Array,元素是字节;对于Int32Array等类型,元素是int32等)。如果
srcOffset大于srcData.length,将生成INVALID_VALUE错误。srcLengthOverride默认为srcData.length - srcOffset。如果从
srcOffset开始的srcData中没有足够的数据,或者传入的数据量与压缩图像的格式、尺寸和内容不一致,将生成INVALID_VALUE错误。
此部分适用于上述四个入口点。
-
如果尝试在没有绑定WebGL纹理的情况下调用这些函数(见上文),将生成
INVALID_OPERATION错误。如果绑定了一个WebGLBuffer到
PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。在OpenGL ES 3.0中定义的ETC2和EAC纹理格式在WebGL 2.0中不可用。
23.void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)
24.void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)
25.void compressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)
26.void compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLintptr offset) (OpenGL ES 3.0.6 §3.8.6, man page)
此部分适用于上述四个入口点。
-
如果尝试在没有绑定WebGL纹理的情况下调用这些函数(见上文),将生成
INVALID_OPERATION错误。如果没有绑定WebGLBuffer到
PIXEL_UNPACK_BUFFER目标,将生成INVALID_OPERATION错误。offset是进入WebGLBuffer数据存储的字节偏移量;如果小于0,将生成
INVALID_VALUE错误。在OpenGL ES 3.0中定义的ETC2和EAC纹理格式在WebGL 2.0中不可用。