我为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
我在桌子上跳动,试图弄清楚这两种情况之间的区别。
着色器逻辑只是将顶点上的颜色传递给片段着色器,因此没有预乘的alpha。
我只需要任何其他想法就能以这种有害的方式影响融合。我可以张贴任何需要的其他信息。
编辑:要在这种环境下显示相同的精确测试,以下是滚轮渲染并以某种方式添加到白色冲洗中:
答案 0 :(得分:0)
似乎我的库中可能存在一些不良的未定义行为:
我两次抓取gl上下文:canvas.getContext(...),每个对象都有可能具有不同的属性,例如上下文的预乘alpha和alpha设置属性。
当我解决该问题时,这个奇怪的混合错误就消失了。因此,我将假定两次上下文获取之间的预乘alpha属性不一致。