2017-05-10 45 views
1

我想創建一個半透明的球體,該球體突出顯示與其他物體(例如地面)相交的地方。如何在OpenGL中創建深度漸變效果?

就像在這張照片上的白線:

image

我發現an Unreal Engine 4 tutorial有關如何創建類似的東西。

它在着色器中使用「深度淡化」。不幸的是,我還沒有找到任何有關Depth Fades的OpenGL教程。

如何創建這樣的效果?

+0

讀取framebuffer深度值,與輸入片段深度進行比較,並根據差異內插顏色?我認爲這可以解釋左側[這裏](https://www.youtube.com/watch?v=mx7dl6A2AvA&t=437)這一列上方的「塗抹」。 – genpfault

回答

2

當然。我不確切知道它的真正意義,但總體思路如下。

首先,您需要一個可讀的深度緩衝區。這意味着要麼進行深度籌備,要麼只是在之後呈現了這種特殊效果,您已經在場景中呈現了不透明物體(您希望此球體相交的物體)。我會假設你知道或者可以想出如何創建和使用你自己的深度緩衝區,以便你可以在後面的步驟中讀回它。您將無法使用GL的默認深度緩衝區(因此您需要幀緩衝區對象,顏色附件,深度附件)。

現在,我們來談談渲染球體。在您的頂點着色器,你將需要:

  • 變換你的頂點像往常一樣
  • 改造後,頂點的深度值寫入不同(你會需要它的片段着色器)

因此,您的頂點着色器的目的是計算您的球體的場景深度並將其傳遞給片段着色器。

片段着色器,這是你做技術的地方。您需要將可讀深度緩衝區綁定到統一的sampler2D。然後:

  • 樣品在當前屏幕位置
  • 計算sceneDepth - currDepth,其中currDepth的是,你從你的VERT着色器通過不同的,並且sceneDepth的是,你從深度緩衝採樣值的深度緩衝
  • 應用一些數學,但你喜歡從這種差異中獲得效果。舉一個非常粗略的例子,這裏的float effectAlpha = exp(-k * max(0.0, sceneDepth - currDepth));k控制它淡出的速度。然後,您可以添加一些顏色,然後將其乘以effectAlpha

最終的一點是,您基於渲染的幾何深度與遮擋場景的深度之間的差異來計算效果。因此「深度消失」。例如,使用類似的技術使水看起來平穩地淡入海岸線。

編輯:我只是掩蓋了教程,並注意到他也使用菲涅耳效應。這是在一些角度給予一些亮點。如果您搜索菲涅耳效應GLSL,應該很容易找到光源 - 菲涅耳在渲染中無處不在,特別是在基於物理的渲染中。基本思想是,當你的物體面向相機時,你將計算出一個0的值('臉部'意思是一個法線向量與相機的方向一致),1表示物體朝向正交於相機。

實際上,在您發佈的屏幕截圖中,菲涅耳看起來並不是非常明顯(菲涅爾效應非常輕微,因爲它大致像五階多項式一樣褪色),因此您可能可以實現大部分想要的效果隨着深度逐漸消失。