我已经为webgl编写了一个库,它有很多测试并且运行这些测试非常精细,包括我用于混合的测试。
我已经设置了测试来进行Src_Alpha,One_minus_Src_Alpha的标准混合,并且测试正确地呈现结果:
该图像通过交叉1000条线而产生,所有线的α值均为0.2。注意图像在任何给定点都不会产生褪色的白色。
这也是使用chrome的webgl 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
现在我使用相同的库并在布局中渲染相同的边缘,它们渲染如下:
这些边缘的不透明度为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
我正试着弄清楚这两种情景之间的区别。
着色器逻辑只是将顶点上的颜色传递给片段着色器,因此没有预乘alpha。
我只是想知道还有什么可以影响这种混乱的混合方式。我可以发布所需的任何额外信息。
编辑:为了在这个环境中显示相同的精确测试,这里是轮子渲染并以某种方式添加到白色冲洗:
似乎我的库中可能存在一些不良的未定义行为:
我抓住gl上下文两次:canvas.getContext(...),每个都有可能为上下文的预乘alpha和alpha设置属性等事物提供不同的属性。
当我解决这个问题时,这个奇怪的混合错误就消失了。因此,我将假设两个上下文抓取之间的预乘alpha属性在某种程度上是不一致的。