Webgl Blending 混合成白色

Webgl Blending is blending to white

我已经为 webgl 编写了一个库,它有很多测试并且可以完美地运行这些测试,包括我用于混合的测试。

我已将测试设置为执行 Src_Alpha、One_minus_Src_Alpha 的标准混合,测试正确呈现结果:

此图像是通过将 1000 条线相交生成的,所有线的 alpha 值为 0.2。请注意图像如何在任何给定点都不会产生褪色的白色。

这也是使用 webgl Spector 插件为 chrome:

生成的当前混合状态
Blend State
BLEND: true
BLEND_COLOR: 0, 0, 0, 0
BLEND_DST_ALPHA: ONE_MINUS_SRC_ALPHA
BLEND_DST_RGB: ONE_MINUS_SRC_ALPHA
BLEND_EQUATION_ALPHA: FUNC_ADD
BLEND_EQUATION_RGB: FUNC_ADD
BLEND_SRC_ALPHA: SRC_ALPHA
BLEND_SRC_RGB: SRC_ALPHA

现在我使用同一个库并在布局中呈现相同的边缘,它们呈现如下:

这些边的不透明度为 0.2。这是 Spector 混合模式:

Blend State
BLEND: true
BLEND_COLOR: 0, 0, 0, 0
BLEND_DST_ALPHA: ONE_MINUS_SRC_ALPHA
BLEND_DST_RGB: ONE_MINUS_SRC_ALPHA
BLEND_EQUATION_ALPHA: FUNC_ADD
BLEND_EQUATION_RGB: FUNC_ADD
BLEND_SRC_ALPHA: SRC_ALPHA
BLEND_SRC_RGB: SRC_ALPHA

我正在苦苦思索 table 试图找出这两种情况之间的区别。

着色器逻辑只是将顶点上的颜色传递给片段着色器,因此没有预乘的 alpha。

我只是想知道还有什么可以影响这种凶残时尚的融合。我可以 post 任何需要的额外信息。

编辑:为了在此环境中显示完全相同的测试,这里是车轮渲染并以某种方式添加到白色冲刷:

我的库中似乎存在一些未定义的不良行为:

我两次获取 gl 上下文:canvas.getContext(...) 并且每个上下文都有可能具有不同的属性,例如上下文的预乘 alpha 和 alpha 设置属性。

当我解决了这个问题后,这个奇怪的混合错误就消失了。所以我会假设两个上下文抓取之间的预乘 alpha 属性 在某种程度上是不一致的。