我有机会更新我们用于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_linear
和OES_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
扩展名。
答案 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
相同。