启用混合时如何避免与背景混合
How to Avoid Blending with Background When Enabling Blending
我正在尝试实现 potree 为实现混合拼音所做的工作。在this example中,当禁用EDL
并将quality
选项切换到Appearance
文件夹中的Splats
时,它显示混合效果。
我的问题是如何避免那些与背景混合的点。当我在我自己的项目中启用混合时,这些点与我的背景颜色混合并且看起来不太好。避免与背景融合的优雅解决方案是什么?
编辑:
您可以看到这些点与白色背景融合在一起。我正在使用自定义着色器来设置 alpha 值。在此图像中,alpha 值为 0.5。
Potree 使用更复杂的混合函数,需要 3 次传递。
- 可见性通道:渲染深度。
- Attribute Pass:添加混合,但仅适用于深度缓冲区后面最多 blendDepth 个单位的点。
- 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 遍飞溅算法渲染您的点,并在最后一步中渲染背景。背景只会在没有渲染点的区域可见。
我正在尝试实现 potree 为实现混合拼音所做的工作。在this example中,当禁用EDL
并将quality
选项切换到Appearance
文件夹中的Splats
时,它显示混合效果。
我的问题是如何避免那些与背景混合的点。当我在我自己的项目中启用混合时,这些点与我的背景颜色混合并且看起来不太好。避免与背景融合的优雅解决方案是什么?
编辑:
您可以看到这些点与白色背景融合在一起。我正在使用自定义着色器来设置 alpha 值。在此图像中,alpha 值为 0.5。
Potree 使用更复杂的混合函数,需要 3 次传递。
- 可见性通道:渲染深度。
- Attribute Pass:添加混合,但仅适用于深度缓冲区后面最多 blendDepth 个单位的点。
- Shading/Normalization 通过:标准化加色输出,从明亮的加色到平滑混合的外观。
属性通道将属性值的加权和输出到 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 遍飞溅算法渲染您的点,并在最后一步中渲染背景。背景只会在没有渲染点的区域可见。