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

时间:2017-07-11 18:49:24

标签: three.js webgl shader point-clouds

我正在尝试实现potree实现混合splats的功能。在this example中,当禁用EDL并将quality选项切换到Splats文件夹中的Appearance时,会显示混合效果。

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

编辑:

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

image

1 个答案:

答案 0 :(得分:1)

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

  1. 可见性通过:渲染深度。
  2. 属性通过:添加混合,但仅适用于深度缓冲区后面最多 blendDepth 单位的点。
  3. 着色/标准化通过:将添加剂输出标准化为从明亮的添加剂到平滑混合的外观。
  4. enter image description here (编辑:取自http://www.ahornung.net/files/pub/Hornung_PBG05.pdf

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

    enter image description here

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

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

    enter image description here

    检查本论文以获得更详细的解释(第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遍splatting算法渲染您的点,并在最后一步中渲染背景。只有在没有渲染点的区域才能看到背景。