我們可以用使用深度帖圖陰影來模擬柔和的光線追蹤 (RayTracing) 的效果 .
衰減 (ATTENUATED) 這個詞的含義是消減和柔化陰影 . 在以下的例子中 , 我們通過調整陰影的顏色來減弱陰影的亮度 . 我們這裡所演示的技巧在某些場景中是十分有效的 . 他能極大的減少渲染時間 . 但是在某些場合慊故潛匦胧褂霉庀咦紛?. 例如當光線通過使用了透明帖圖的物體或有顏色的透明表面時 , 就要必須使用光線追蹤 .( 但即使是後面兩種情況有時也可以用深度帖圖模擬光線追蹤 . 可以參考我翻譯的另一篇教程。
下面兩圖是左邊用光線追蹤右邊是衰減深度帖圖渲染 . 效果差不多但是光線追蹤的渲染時間要多 2.6 倍 .
Section1
打開場景 attenuatedDmapShadow.mb 這個場景包含一個椅子模型和一個加上了 attenuated dmap shadow 效果的聚光燈 , 其名稱為 dmapSoftShadow.
Section2 .
在 Hypershade 窗口中的 light 選項卡下選擇 dmapSoftShadow, 並點擊 Show Upstream Connections 按鈕 . 便可以看到這個聚光燈的網絡節點 . 這個網絡是為了從最近點到最遠點淡化陰影而設置的 . 它包含 3 個 Locators, 一個燈光信息節點以及一些能驅使兩個 Ramp textures 調整陰影的過濾尺寸和顏色屬性的數學節點 .
Section3
Locator 的作用是在空間裡標定位置 . 第一個 Locator 的位置就是聚光燈的位置 , 他和聚光燈之間有 constrained 的聯系 . 另外兩個 Locator 分別在陰影的開始和結束的位置 .
Section4
這 3 個 locators 與 2 個 Distance Between 節點連接 .Distance Between 節點是用來計算聚光燈和另外兩個 locator 的距離的 .
Distance Between 節點輸出的是 3D 空間上兩點間的距離 . 是通過下面的公式計算的 .
(x1,y1,z1) 和 (x2,y2,z2) 分別是兩個 locator 的坐標 .
注意 : 必須用 MEL 命令來創建 Distance Between 節點 , 輸入 createNode distanceBetween; 命令 . 這個節點不會在 Hypershade 出現 . 你必須在 Outliner 中用鼠標中鍵把它拖到 Hypershade 中去 .
Section5
然後把聚光燈到兩個 locator 的距離連接到 plusMinusAverage Utility 節點上 . 並將此節點設為 Subtract 方式 . 這是一個將聚光燈到兩個 locator 的距離相減的工具 . 我們可以了解到兩個距離之差 ( 注意這裡是遵循矢量加減法則 )
這個距離上的差值將決定兩個 Ramp texture 節點如何影響 dmap shadow 的 Filter Size 和 Shadow Color.
Section6
為了確定聚光燈到某個點的距離 , 必須使用 Light Info Utility 節點 . 和 Sampler Info 節點相似 ,Light Info 節點與其他節點連接時能提供某個被渲染點的信息 .
Light Info 與 Sampler Info 不同之處在於需要將一個燈光信息連接到 Light Info 上 . 你會注意到在渲染網絡中 dmapSoftShadow 聚光燈的 worldMatrix[0] 屬性連接到了 Light Info 節點的 worldMatrix 屬性上 . 它告訴了 Light Info 從場景中的什麼地方計算輸出屬性 Sample Distance.
Sample Distance 是從聚光燈中心到某個被渲染點的距離 .
注意 :Light Info 節點在確定 Sample Distance 時十分有用 .
Section7 和 section5 的方法類似 , 我們用另一個 plusMinusAverage 節點來確定 Sample Distance 和聚光燈到 startShadow locator 的距離差 . 為方便起見 , 這個差值命名為 sample point difference.
Section8
上一步中得到的 sample point difference 是用來調整陰影的 . 如果這個值比較小 , 那麼被渲染的點就離 startShadow locator 比較近 . 如果這個值比較大 , 那麼被渲染的點就離 startShadow locator 比較遠 .
但是這個 sample point difference 地值可以是從 0 到一個很大的數 . 這個無限的范圍不太適合用於 Ramp 節點 .Ramp 節點適合於 0-1 的范圍 . 為了解決這個問題 , 需要使用一些數學手段來把這個距離差值轉化到 0-1 的范圍內 .
我們把 Section5 中得到的聚光燈到 startShadow locator 和 endShadow locator 的距離之差稱為 total difference.
使用 Multiply Divid 節點 , 計算出 sample point difference 與 total difference 的比值 . 即 sample point difference 在 total difference 所占百分比 . 這樣就把 sample point difference 轉換到了 0-1 范圍內 .
注意 : 對於位預 startShadow locator 與聚光燈之間和 endShadow locator 之外的點的返回值將不在 0-1 之間 . 我們將在下一個節點 Clamp 中調整 . 因此 locator 的位置並不需要十分精確的位於陰影開始和結束的地方 . 我們可以以後在做調整 .
Section9
Clamp 節點能把輸入值限制在一定范圍內輸出 .Multiply Divide 節點在被連接到 Ramp 節點的 vCoordinate 屬性之前 , 將通過先 Clamp 節點來限制范圍 .Clamp 的 Min 和 Max 分別設為 0 和 1. 這意味這從 Multiply Divide 節點過來的輸入值在 0-1 之間的保持不變 . 小於 0 的按 0 輸出 , 大於 1 的按 1 輸出 .
注意 : 在 clamp 節點中只使用 x-channel. 這是因為距離這個屬性是單值的 . 當輸入的是 3 值類型的數據時 ( 例如顏色的 RGB 值 ) 就要用到其他的 channel.
在這個渲染網絡中 ,clamp 節點的輸出值將連接到 Ramp 節點的 vCoordinate 屬性上 .0 表示 vCoordinate 在底部 .1 表示 vCoordinate 在頂部 .
我們可以通過調整 ramp 的位置和數值來控制輸出 . 最後 ramp 將連接到聚光燈的 Filter Size 和 Shadow Color 屬性上 . 注意 : 如果輸入的數據沒有經過 clamp 節點 , 在 0-1 范圍之外的數據將重復 coordinate 的值 . 會導致一些不可預料的結果 .( 如下圖 )
Section10
最終將用 2 個 ramp 節點來控制 dmap shadow 的 Filter Size 和 the Shadow Color 屬性 .
Filter Size 將影響 dmap shadow 的柔化和模糊效果 . 本例中它被 blurInterpolationRamp 節點控制 . 這個節點有兩個 color entries. 在底部設為 2, 在頂部設為 32.
這意味著 Filter Size 的最小值為 2, 這個值用於渲染離 startShadow locator 最近的點 . 而最大值 32 將用於渲染離 endShadow locator 最近的點 . 這能給 dmap shadow 產生柔化的衰減效果 .
下圖是將 Filter Size 設為 1 和不設置的比較 .
為了加強最終效果 , 我們把另一個 ramp 節點連接到 Shadow Color 屬性上 . 這個 ramp 的兩個 color entries 的值分別設為 0.5 和 -0.5. -0.5 將 startShadow locator 附近的陰影變暗 . 而 0.5 使 endShadow locator 附近的陰影變亮和透明 .
結論
以上例子證明了我們可