2015-11-05 92 views
1

製作透明的東西並不困難,但我需要透明度根據對象的曲線變得不同,以使其看起來不僅僅是一個平面對象。像下面的圖片。 弧形磨砂玻璃着色器?

中心比圓柱體的側面更透明,它是更黑的背景色。然後是頂部似乎有某種鏡面照明的擋板,使其更加閃亮,但在這種情況下,我不知道如何去實現這種透明度。使用相對於眼睛位置的表面的法線來確定透明度值?任何幫助,將不勝感激。

+1

你不想透明度,光散射,而不是...看到http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html簡而言之光發射dependednt視圖上線長度會通過對象和其傾斜或整個光源覆蓋/光源...在這裏另一個散射的例子(GLSL中的礦井氣氛)http://stackoverflow.com/a/19659648/2521214 – Spektre

+0

@Spektre我喜歡深度圖的想法,idk是否與您鏈接的實現不同,但是如何選擇一個點來確定距離?作爲一個例子,對於光線在頂部的圓柱體。深度圖本質上是一個圓圈。但是說相機是從側面看的,所以你實際上正在渲染一個矩形,你如何將它從光源的角度映射到深度緩衝區?沒有GPU寶石的來源? – user240713

+0

將評論移至答案...向您的問題添加了相關標籤,併爲有趣的問題添加了相關標籤(有趣的是,需要爲此添加2個新標籤) – Spektre

回答

2

(移動註釋到答案,並增加了一些更多的細節)

,而不是使用透明度(Sub Surface) scattering

你可以簡化很多事情,例如假設光源沿着整個表面/體積是恆定的......所以你只需要視圖光線集成而不是每個光線的整體積分......我這樣做我的大氣着色器,它仍然看起來非常真棒幾乎難以區分從真實的東西看some newer screenshots ...已經比較它來自地球和火星的照片,並在沒有任何真正的複雜數學相當接近的結果。

有更多的選擇如何實現這一目標:

  1. 體素地圖(體積渲染)

    這是很容易實現分散到體積渲染引擎,但需要大量的內存和力量。

  2. 使用2深度緩衝器(前和後表面)

    這種需要2次與卡爾面和CW/CCW設置。這也很容易實現,但是這不能沿着相機視圖的Z軸在同一視圖中處理多個對象。我們的想法是將兩個深度緩衝區傳遞給着色器,並將像素光線沿其路徑累積/吸收來自光源的光線。事情是這樣的:

    SSS 2 Depth buffers

    1. 呈現幾何雙方深度緩衝爲2個紋理。
    2. 渲染四覆蓋整個屏幕
    3. 每個片段計算射線線(綠色)
    4. 計算在展臺深度緩衝器 交點獲得「長度,昂」
    5. 使用散射沿長度整合計算像素顏色

      我用的是這樣的:

      vec3 p,p0,p1; // p0 front and p1 back face ray/depth buffer intersection points 
          int n=16; // integration steps 
          dl=(p1-p0)/float(n); // integration step vector 
          vec3 c=background color; 
          float q=dot(normalize(p1-p0),light)=fabs(cos(ang)); // normal light shading 
      
          for (p=p1,i=0;i<n;p1-=dp,i++)    // p = p1 -> p0 path through object 
           { 
           b=B0.rgb*dl; // B0 is saturated color of object 
           c.r*=1.0-b.r; // some light is absorbed 
           c.g*=1.0-b.g; 
           c.b*=1.0-b.b; 
           c+=b*q;  // some light is scattered in 
           } // here c is the final fragment color 
      

    經過整合之後,您應該對顏色進行規範化處理,以使得到的顏色在渲染材質的實際視圖深度周圍飽和。更多信息請參閱下面的大氣散射鏈路(這一段代碼是從它提取)

  3. 分析對象表示

    如果知道表面方程然後就可以計算內部着色器中的光路交叉,而不需要深度緩衝區或體素圖。這Simple GLSL Atmospheric shader of mine使用這種方法,因爲橢球很容易以這種方式處理。

  4. 射線追蹤

    如果你需要的精度和不能使用體素的地圖,那麼你可以嘗試光線追蹤引擎來代替。但是,所有的散射渲染/引擎(#1,#2,#3包括)是射線示蹤劑反正...正如你可以看到所有技術這裏討論是相同的唯一的區別是的方法獲取光線/​​物體邊界的交點。

+0

我如何獲得光線方向?如果我已經渲染了整個視圖,那麼我必須使用相機+投影矩陣的逆算法將UV座標轉換爲空間中的3D位置,然後我將其歸一化爲用於計算的方向?那麼這是用來計算燈的角度? – user240713

+0

@ user240713你得到了片段的屏幕空間座標,......光線方向就是那個點 - 相機焦點...光線也是一個矢量,不需要角度點產品就夠了......只要確保你做到了所有的計算在同一個座標系中。正如我寫到我看到的大氣散射着色器,所有的東西都在那裏(包括射線計算),唯一的區別是計算'p0,p1'點和稍微更復雜的散射方程,這是由於隨着高度變化的空氣密度。 .. – Spektre

+0

我看着它,它似乎只是使用頂點位置作爲像素位置。那是對的嗎?然後對於一個圓柱體,我不認爲這是可行的,因爲所有的頂點都在頂部或底部。如果您正在繪製中間,則選擇其中一個頂點不能很好地工作。 – user240713