1

我有机会将我们使用的渲染器更新为 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_linearWebGL2 的实现我在本地有OES_texture_float_linear但没有OES_texture_half_float_linear,而 WebGL 两者都有。我知道在 WebGL1 上下文中的OES_texture_float_linear行为有点不同,所以我的直觉说可能存在问题。

此外,disjoint_timer_query扩展发生了一些奇怪的事情。该扩展被部分合并。WebGL2 上下文获得了该扩展的一些属性。我disjoint_timer_query_webgl2在 Chrome 中拥有除getQueryObject重命名为的属性之外的所有属性getQueryParameter,但在 Firefox 中,disjoint_timer_query扩展仍然可用于 WebGL2 上下文。

那么,这份清单是否完整?而且,特别是,应该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扩展。

4

1 回答 1

2

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.

于 2017-05-16T04:25:51.527 回答