深度緩衝中的深度值計算及視覺化

2022-02-26 14:03:00 字數 2632 閱讀 7294

在渲染管線中的頂點變換中,介紹了頂點在各個座標空間的變換。變換到最後,是螢幕座標空間。在opengl中,螢幕空間座標的z值即是深度緩衝中的深度值。深度緩衝包含了乙個介於0.0和1.0之間的深度值,它將會與觀察者視角所看見的場景中所有物體的z值進行比較。本文將介紹深度值的計算,以及從深度值反向計算出相機空間中的頂點的z值。

在渲染管線中的頂點變換中,計算得到了透視投影矩陣:

\[m_ =

\begin

\frac & 0 & \frac & 0 \\

0 & \frac & \frac & 0 \\

0 & 0 & \frac & \frac \\

0 & 0 & 1 & 0 \\

\end

\]同時,也得到了視口變換矩陣:

\[m_ =

\begin

\frac & 0 & 0 & \frac \\

0 & \frac & 0 & \frac \\

0 & 0 & \frac & \frac \\

0 & 0 & 0 & 1 \\

\end

\]首先,根據透視矩陣,計算ndc空間的z值。這裡,相機空間中的座標經過透視矩陣變換後,還要進行齊次除法,才能得到ndc空間中的座標。

\[\begin

x_ \\

y_ \\

z_ \\

w_ \\

\end =

m_\begin

x_ \\

y_ \\

z_ \\

w_ \\

\end

\]\[\begin

x_ \\

y_ \\

z_ \\

\end =

\begin

\frac}} \\

\frac}} \\

\frac}} \\

\end

\]由此,可以得出:

\[\begin

\begin

z_ &= \fracz_+\frac}} \\

&=\frac+\frac(f-n)}

\end

\tag

\end

\]根據上述公式,可以得出:

\[z_ = \frac(f-n)} \tag

\]根據視口變換矩陣,可以得出:

\[z_ = \fracz_+\frac \tag

\]將\(\left(1\right)\)帶入\(\left(3\right)\),可以得到:

\[\begin

z_ &= \frac(z_+1) \\

&=\frac(\frac+\frac(f-n)} + 1) \\

&=\frac}} \\

&= \frac-\frac}}-\frac}

\end

\]即:

\[z_ = \frac-\frac}}-\frac} \tag

\]到這一步,即可以求得螢幕空間中的深度。

在learn opengl cn學習過的,可能對深度測試這一節的內容有些印象。它得到的深度值的公式是:

\[f_ = \frac

\]跟\(\left(4\right)\)式對比,發現有些不一樣,這是怎麼回事呢?

這裡要注意,本文定義的\(n\)、\(f\)和\(z_\)是實際的座標值,是負的。而深度測試文中,定義的\(near\)、\(far\)代表了**面和遠*面,而\(z\)代表了*、遠*面之間的值,它們都是正的。將\(n=-near\)、\(f=-far\)、\(z_=-z\)代入\(\left(4\right)\)式,可得:

\[\begin

f_ &= z_ \\

&= \frac-\frac}}-\frac} \\

&= \frac-\frac}-\frac} \\

&= \frac-\frac}-\frac}

\end

\]經過上面的推導,我們得出了深度值的計算公式。

現在,反過來,我們知道了螢幕空間中的深度值,怎麼求出相機空間中的深度值呢?

首先,根據\(\left(3\right)\),可以推導出:

\[z_ = 2z_-1

\]對於公式2,得出的是實際座標的\(z\)值。為了和opengl中的定義統一,也將\(near\)、\(far\)和\(z\)代入公式\(\left(2\right)\),可以得到:

\[\begin

\begin

z_ &= \frac((-far)-(-near))} \\

&= \frac(near-far)} \\

\end

\tag

\end

\]在深度測試這一節中,得出的公式是:

\[float \quad lineardepth = (2.0 * near * far) / (far + near - z * (far - near));

\]對比發現,跟公式\(\left(5\right)\)有些不一樣。這是因為,\(lineardepth\)求出的是頂點距離相機的距離,是正值。而\(z_\)是頂點的實際座標,是負值,將\(z_\)取反,即可得到\(lineardepth\)。

\[\begin

lineardepth &= -z_ \\

&= \frac(far-near)}

\end

\]至此,推導完成。

深度學習 TensorBoard視覺化

1 概述 tensorboard是tensorflow的視覺化工具 通過tensorflow程式執行過程中輸出的日誌檔案視覺化tensorflow程式的執行狀態 tensorflow和tensorboard程式跑在不同的程序中 清除default graph和不斷增加的節點 tf.reset def...

深度學習 Keras MNIST 資料視覺化

學習 機器學習 machine learning 或 深度學習 deep learning 的乙個重要關鍵是 視覺化 visualization 視覺化 可以用在資料上 或是在模型上 或是在結果上 或是在過程上。本文是 keras mnist 的資料視覺化。注 以上程式在 enthought can...

如何視覺化深度學習網路中Attention層

在訓練深度學習模型時,常想一窺網路結構中的attention層權重分布,觀察序列輸入的哪些詞或者詞組合是網路比較care的。在小 中主要研究了關於詞性pos對輸入序列的注意力機制。同時對比實驗採取的是words的self attention機制。下圖主要包含兩列 word attention是sel...