启用混合时如何避免与背景混合

How to Avoid Blending with Background When Enabling Blending

我正在尝试实现 potree 为实现混合拼音所做的工作。在this example中,当禁用EDL并将quality选项切换到Appearance文件夹中的Splats时,它显示混合效果。

我的问题是如何避免那些与背景混合的点。当我在我自己的项目中启用混合时,这些点与我的背景颜色混合并且看起来不太好。避免与背景融合的优雅解决方案是什么?

编辑:

您可以看到这些点与白色背景融合在一起。我正在使用自定义着色器来设置 alpha 值。在此图像中,alpha 值为 0.5。

Potree 使用更复杂的混合函数,需要 3 次传递。

  1. 可见性通道:渲染深度。
  2. Attribute Pass:添加混合,但仅适用于深度缓冲区后面最多 blendDepth 个单位的点。
  3. Shading/Normalization 通过:标准化加色输出,从明亮的加色到平滑混合的外观。

(编辑:摘自 http://www.ahornung.net/files/pub/Hornung_PBG05.pdf

属性通道将属性值的加权和输出到 rgb 通道,并将权重和输出到 alpha 通道。 每个点的权重 w 取决于到中心的距离。 片段着色器的输出是:gl_FragColor = vec4(w * rgb, w)

归一化过程是一个屏幕 space post 处理着色器,它将帧缓冲区中的每种颜色除以权重: gl_FragColor = vec4(weightedSumOfRGBs / sumOfWeights, 1.0)

最终结果是平滑的混合点,过渡硬度取决于权重函数:

查看这篇论文以获得更详细的解释(第 4.2.2 章):

https://www.cg.tuwien.ac.at/research/publications/2016/SCHUETZ-2016-POT/SCHUETZ-2016-POT-thesis.pdf

或者这篇算法的原论文:

http://www.ahornung.net/files/pub/Hornung_PBG05.pdf

编辑:

此外,为避免看穿背景,请使用黑色和 alpha = 0 清除缓冲区,然后使用高质量的 3 遍飞溅算法渲染您的点,并在最后一步中渲染背景。背景只会在没有渲染点的区域可见。