WebGL2

时间:2017-05-15 19:52:42

标签: webgl webgl2 webgl-extensions

我有机会更新我们用于WebGL2的渲染器。为了使渲染器尽可能向后兼容,我们会一直跟踪加载的扩展(正如我们在升级之前所做的那样)并模拟扩展,即使这样的扩展已被提升。渲染器通过扩展执行一些相关操作。从外面看,一切都很透明。

为了使其顺利运行,我需要完整的推广扩展列表。找到了很少的博客,但这些列表并不完整。我在GitHub上找到的其他列表看起来不对,因为它们有冗余的扩展,实际上没有被提升或被删除。我在文档中找不到太多东西。

所以,我做了一些实证研究,发现:

// 12 extensions were promoted in WebGL2 without surprises
[
  'ANGLE_instanced_arrays',
  'EXT_blend_minmax',
  'EXT_frag_depth',
  'EXT_shader_texture_lod',
  'EXT_sRGB',
  'OES_element_index_uint',
  'OES_standard_derivatives',
  'OES_texture_float',
  'OES_texture_half_float',
  'OES_vertex_array_object',
  'WEBGL_depth_texture',
  'WEBGL_draw_buffers',
]

我特别关注OES_texture_float_linearOES_texture_half_float_linear扩展名,这些扩展名不在我的列表中。 WebGL2的实现我本地有OES_texture_float_linear但没有OES_texture_half_float_linear,而WebGL有两个。{1}}。我知道在WebGL1上下文中OES_texture_float_linear的行为有点不同,所以我的直觉说可能存在问题。

此外,disjoint_timer_query扩展程序发生了一些奇怪的事情。该扩展部分合并。 WebGL2上下文获得了该扩展的一些属性。我在Chrome中有disjoint_timer_query_webgl2,其中包含除getQueryObject之外的所有属性,这些属性已重命名为getQueryParameter,但在Firefox中,disjoint_timer_query扩展名仍可用于WebGL2上下文。< / p>

那么,该清单是否完整?特别是,OES_texture_half_float_linear应该列在名单上吗?为什么它消失了,而类似的OES_texture_float_linear仍然存在?

感谢您的帮助。

-

所以最后的答案(可能)应该是:

// 14 extensions were promoted in WebGL2
[
  'ANGLE_instanced_arrays',
  'EXT_blend_minmax',
  'EXT_frag_depth',
  'EXT_shader_texture_lod',
  'OES_element_index_uint',
  'OES_standard_derivatives',
  'OES_texture_float',
  'OES_texture_half_float',
  'OES_vertex_array_object',
  'WEBGL_depth_texture',
  'WEBGL_draw_buffers',
  /* with caveats */
  'EXT_sRGB',
  'OES_texture_half_float_linear',
  'EXT_disjoint_timer_query',
]

请注意,最后三个延期是通过警告提升的。 扩展程序EXT_sRGB丢失了常量SRGB_ALPHA。 推广OES_texture_half_float_linear,而类似的OES_texture_float_linear则没有。 部分推广EXT_disjoint_timer_query。该扩展的某些属性出现在WebGL2上下文中,而其他属性则移至EXT_disjoint_timer_query_webgl2扩展名。此外,目前(2017.05.16)Firefox WebGL2上下文仍然有EXT_disjoint_timer_query个扩展名,没有EXT_disjoint_timer_query_webgl2扩展名。

1 个答案:

答案 0 :(得分:1)

WebGL2需要支持半点和浮点纹理。它还需要对半纹理进行过滤,但不需要支持过滤的浮点纹理。

这就是OES_texture_half_float_linear缺失和OES_texture_float_linear是可选的原因。大多数移动设备不支持对浮点纹理进行过滤。

换句话说,您应该将OES_texture_half_float_linear添加到推广的扩展程序列表中。

另一个有奇怪历史的扩展名是EXT_color_buffer_float。没有它的WebGL1发货。假设渲染到浮点纹理,您需要的只是OES_texture_float,然后制作浮点纹理,将其附加到帧缓冲区并检查gl.checkFramebufferStatus。但是,在WebGL发布一年后,有人指出这是不够的,所以EXT_color_buffer_float被添加但是没有强制执行,因为这样做会破坏页面。

在WebGL2中 强制执行。如果不启用EXT_color_buffer_float,则无法渲染到浮点纹理。与EXT_color_buffer_half_float相同。