我正在尝试将加权混合OIT改造到我的渲染管道中,尽管它可以很好地工作,产生令人信服的结果,但对于普通的alpha混合(基于OVER)运算符,我正在努力使其支持加法混合(例如Colour1 + Colour2 +背景颜色)正确地使用混合公式:

$$ \ 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