如何在 OpenGL 中创建深度淡入淡出效果?

How to create Depth Fade effect in OpenGL?

我想创建一个半透明的球体,它在与其他物体(例如地面)相交的地方突出显示。

喜欢这张图中的白线:


我发现 an Unreal Engine 4 tutorial 关于如何创建类似的东西。

它在着色器中使用"depth fade"。不幸的是,我还没有找到任何关于 Depth Fades 的 OpenGL 教程。

怎么可能创造出这样的效果?

当然可以。不知道Unreal具体是什么意思,大致意思如下

首先,您需要一个可读的深度缓冲区。这意味着要么做一个深度预通道,要么只渲染这个特殊效果 你渲染了场景中的不透明对象(你希望这个球体与之相交的对象)。我假设您知道或可以弄清楚如何创建和使用您自己的深度缓冲区,以便您可以在后面的步骤中读回它。您将无法为此使用 GL 的默认深度缓冲区(因此您将需要一个帧缓冲区对象、颜色附件、深度附件)。

现在,我们来谈谈渲染球体。在您的顶点着色器中,您需要:

  • 照常变换顶点
  • 转换后,将顶点的深度值写入变量(片段着色器中需要它)

所以顶点着色器的目的是计算球体的场景深度并将其传递给片段着色器。

片段着色器 中,这是您执行该技术的主要部分。您需要将可读深度缓冲区绑定到统一的 sampler2D。那么:

  • 在当前屏幕位置采样深度缓冲区
  • 计算 sceneDepth - currDepth,其中 currDepth 是您从垂直着色器传入的变量,sceneDepth 是您从深度缓冲区采样的值
  • 应用一些你喜欢的数学来从这种差异中获得效果。举个很粗略的例子,这里的float effectAlpha = exp(-k * max(0.0, sceneDepth - currDepth));k控制淡出的速度。例如,您可以添加一些颜色,然后将其乘以 effectAlpha.

归根结底,关键是您要根据渲染几何体的深度和遮挡场景的深度之间的差异来计算效果。因此 'depth fade.' 使用类似的技术,例如,使水看起来平滑地消失在海岸线上。

编辑: 我只是略过教程并注意到他还使用了菲涅耳效果。这在掠过的角度上给出了一些亮点。如果您搜索 Fresnel effect GLSL,应该很容易找到来源——Fresnel 在渲染中无处不在,尤其是在基于物理的渲染中。基本思想是,您将计算一个值为 0 的值,其中您的对象 'faces' 相机('faces' 表示具有与相机方向对齐的法向量),并且 1 您的对象面向与相机正交的方向。

实际上,在您发布的屏幕截图中,菲涅耳效果似乎并不明显(菲涅耳效果非常轻微,因为它大致像 5 次多项式一样逐渐消失),因此您可能可以实现大部分目标想要单独使用深度淡化。