簡體   English   中英

如何在體積渲染中操縱深度值以對其進行校正?

[英]How to manipulate depth value to correct it in volume rendering?

我有一個兩階段的體積渲染器,我正在使用DVR方法渲染該體積,但是深度緩沖不適用於該體積,因為我是從盒子中使用光線投射的。

實際上我有一個盒子,我應該根據體積數據計算正確的深度值。

我在頂點着色器中有這個:

out float DEPTH ;
...
DEPTH = gl_Position.z / gl_Position.w;

並在片段中:

gl_FragDepth = (1.0 - 0.0) * 0.5 * DEPTH + (1.0 + 0.0) * 0.5;

而且它們恰好適合盒子,我的主要問題是如何在DEPTH上添加一些位以得出正確的深度值?

我也使用了(distanceToAdd/100 + DEPTH) ,但這是錯誤的。
任何想法?

經過一些澄清后,主要問題似乎是如何組合實體網格和體積,以便在相交時,體積僅渲染到實體對象的表面

為了解決這個問題,我們需要分兩次渲染場景

  1. 使用附加的深度緩沖區將所有實體對象渲染到幀緩沖區對象(FBO)中
  2. 使用修改的步數和初始顏色渲染所有體積。

我將在以下各節中詳細說明

修改的步數

通常,您為光線行進算法計算兩個點:光線與立方體的近交和遠交。 這可以通過將射線x = o + t*d轉換為立方體空間並為t取最小t_min和最大值t_max來實現。 如果要使固體對象與體積相交,則需要確保正確調整這些點。

  • 通常不必調整近點 ,因為如果立方體的前部在實體對象的表面后面,則不會渲染像素。
  • 需要根據當前像素的深度值調整遠點
    • 計算當前像素處對象表面的世界空間坐標( 通過應用逆投影和視圖變換
    • 通過應用多維數據集的逆世界變換來計算對象表面的多維數據集空間坐標p
    • 計算t_surf ,使p = o + t_surf * d ,即計算射線到達固體表面的距離
    • t_maxt_surf之間的最小值,並將其t_surf距射線原點的新最大距離t_max 這樣,您將忽略位於實體表面后面的所有體積部分。

修改后的初始顏色

通過當前修改,可以在實體表面正確剔除該體積,但是仍然只能看到黑色背景,而不能看到實體表面的顏色。

為了解決這個問題,只需堅持從前后的構圖並將初始值設置為表面的顏色(而不是像通常情況下那樣將其設置為黑色)。 這樣,如果體積在某個點上完全透明,則可以看到實心表面,如果它有些不透明,則會與表面前面的體積混合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM