使用 WebGL 扩展
WebGL 及其姊妹 API(OpenGL 和 OpenGL ES)都支持扩展。完整的扩展列表可在 khronos webgl 扩展注册表 中找到。
注意:在 WebGL 中,与其他 GL API 不同,只有在显式请求时才可以使用扩展。
规范扩展名称、供应商前缀和首选项
浏览器供应商可能会在扩展正式批准之前(但仅在扩展处于草案阶段时)支持这些扩展。在这种情况下,其名称可以以供应商前缀(MOZ_
、WEBKIT_
等)开头,或者只有在切换浏览器首选项后才能使用该扩展。
如果您希望使用最前沿的扩展,并希望在批准后继续使用(当然,假设扩展不会以不兼容的方式更改),那么您需要查询规范扩展名称和供应商扩展名称。例如
js
const ext =
gl.getExtension("OES_vertex_array_object") ||
gl.getExtension("MOZ_OES_vertex_array_object") ||
gl.getExtension("WEBKIT_OES_vertex_array_object");
请注意,供应商前缀已被弃用,因此大多数浏览器通过功能标记而不是供应商前缀来实现实验性扩展。
功能标记为
- Firefox 中的
webgl.enable-draft-extensions
- Chromium 基于浏览器的浏览器(Chrome、Opera)中的
chrome://flags/#enable-webgl-draft-extensions
。
命名约定
WebGL 扩展以“ANGLE”、“OES”、“EXT”或“WEBGL”为前缀。这些前缀反映了来源和意图
ANGLE_
:由 ANGLE 库 作者编写的扩展。OES_
和KHR_
:反映 OpenGL ES (OES) 或由各自体系结构审查委员会 (Khronos) 批准的 OpenGL API 扩展的功能的扩展。OVR_
:针对虚拟现实进行优化的扩展。EXT_
:反映其他 OpenGL ES 或 OpenGL API 扩展的扩展。WEBGL_
:特定于 WebGL 且旨在与多个 Web 浏览器兼容的扩展。它还应用于源自 OpenGL ES 或 OpenGL API 但其行为已发生重大更改的扩展。
查询可用扩展
WebGL 上下文支持查询哪些扩展可用。
js
const available_extensions = gl.getSupportedExtensions();
WebGLRenderingContext.getSupportedExtensions()
方法返回一个字符串数组,每个字符串代表一个受支持的扩展。
扩展列表
当前的扩展为
ANGLE_instanced_arrays
EXT_blend_minmax
EXT_color_buffer_float
EXT_color_buffer_half_float
EXT_disjoint_timer_query
EXT_float_blend
EXT_frag_depth
EXT_shader_texture_lod
EXT_sRGB
EXT_texture_compression_bptc
EXT_texture_compression_rgtc
EXT_texture_filter_anisotropic
EXT_texture_norm16
KHR_parallel_shader_compile
OES_draw_buffers_indexed
OES_element_index_uint
OES_fbo_render_mipmap
OES_standard_derivatives
OES_texture_float
OES_texture_float_linear
OES_texture_half_float
OES_texture_half_float_linear
OES_vertex_array_object
OVR_multiview2
WEBGL_color_buffer_float
WEBGL_compressed_texture_astc
WEBGL_compressed_texture_etc
WEBGL_compressed_texture_etc1
WEBGL_compressed_texture_pvrtc
WEBGL_compressed_texture_s3tc
WEBGL_compressed_texture_s3tc_srgb
WEBGL_debug_renderer_info
WEBGL_debug_shaders
WEBGL_depth_texture
WEBGL_draw_buffers
WEBGL_lose_context
WEBGL_multi_draw
启用扩展
在可以使用扩展之前,必须使用 WebGLRenderingContext.getExtension()
启用它。例如
js
const float_texture_ext = gl.getExtension("OES_texture_float");
如果扩展不受支持,则返回值为 null
,否则为扩展对象。
扩展对象
如果扩展定义了 WebGL 核心规范中不可用的特定符号或函数,则可以通过对 gl.getExtension()
的调用返回的扩展对象获得这些符号或函数。