$$ \ frac {C_1 w_1 + C_2 w_2} {\ alpha_1 w_1 + \ alpha_2 w_2} \ cdot \ bigl(1-(1-\ alpha_1) (1-\ alpha_2)\ bigr)+ \ text {Bg} \ cdot(1-\ alpha_1)(1-\ alpha_2)$$
我可以破解输出权重值为1且非常较低的alpha(例如0.01),这使其可能会收敛到加法混合,麻烦的是,这根本不会加重颜色,也无法与普通alpha混合很好地融合。
想知道人们如何解决这个问题。
#1 楼
我为OVER运算符使用了此特定公式,但没有进行添加剂混合。我将在以下讨论中使用该论文的术语:$$ C_f = \ frac {\ sum_ {i = 1} ^ {n} C_i \ cdot w(z_i,\ alpha_i)} { \ sum_ {i = 1} ^ {n} \ alpha_i \ cdot w(z_i,\ alpha_i)}(1-\ prod_ {i = 1} ^ {n}(1-\ alpha_i))+ C_0 \ prod_ {i = 1} ^ {n}(1-\ alpha_i)$$
在本文中没有明确指出,但是术语$$ C_i $$是预乘alpha颜色(即
color.rgb * color.a
) 如本文所述,术语
$$ C_0 \ prod_ {i = 1} ^ {n}(1-\ alpha_i)$$
提供了“显示的背景色。如果所有透明表面都是透明的,则乘积将为1,并且背景将完全可见。方程的其余部分提供了按距离对透明表面进行排序并使用带有预乘alpha颜色的OVER运算符的近似结果。
但是,添加混合的方程(使用
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
和glBlendEquation(GL_FUNC_ADD)
)不带权重的是:$$ C_f = \ sum_ {i = 1} ^ {n} \ alpha_iRGB_i + C_0 $$
该方程式已经是与顺序无关的!为了最后通过归一化步骤将权重添加到透明表面,可以将等式简化为:
$$ C_f = \ frac {\ sum_ {i = 1} ^ {n } C_i \ cdot w(z_i,\ alpha_i)} {\ sum_ {i = 1} ^ {n} w(z_i,\ alpha_i)} + C_0 $$
如果您愿意保留通过使用与以前相同的公式,可以通过将清单3中的着色器输出更改为以下内容来获得相同的结果:
gl_FragData[0] = vec4(Ci, 1) * w(zi, ai);
gl_FragData[1] = vec4(0);
#2 楼
使用以下等式进行混合$$
\ frac {\ alpha_1 w_1 C_1 + \ alpha_2 w_2 C_2} {\ alpha_1 w_1 + \ alpha_2 w_2}。(1-(1- \ alpha_1)(1 -\ alpha_2))+ Bg。(1- \ alpha_1)(1- \ alpha_2)
$$
还要注意,$ \ alpha $的值必须始终在$ 0 $和$ 1 $
评论
$ \ begingroup $
这与上面的没有太大不同,是吗? :-)关键是您需要输出很小的alpha值以保持尽可能多的Bg,并依赖于大规模的输出Colors来补偿这些alphas对累积颜色造成的抑制。确保分母也不为零。
$ \ endgroup $
– Kostas Anagnostou
17年2月3日,9:02
$ \ begingroup $
有区别。请注意,alpha乘以分子中的颜色即可解决问题。
$ \ endgroup $
– Amirhessam
17-2-3在20:03
$ \ begingroup $
为了帮助人们评估是否使用这种方法,您是否可以添加一个解释为什么这可以解决问题中的方法?
$ \ endgroup $
– trichoplax
17 Mar 5 '17 at 13:38