植被透光性算法測量與實踐

2021-02-18 Unity3D遊戲開發精華教程乾貨
植被透光性算法測量與實踐需求來源

圖形渲染方面說,生死狙擊2項目已經度過了3年開發期。開始進入高畫質提升階段,所以再一次優化植被的算法。主要是unity terrain的草不支持normal貼圖,smoothness貼圖,specular參數,厚度貼圖(做透光性效果)和AO貼圖等,也不支持陰影。所以這次提升主要是實現這些,但大部分都是pbr常規算法復用就不寫了。不同於引擎standard內算法的地方是2處,透光性效果和特殊草陰影(陰影后面會單獨寫一篇)。因為並不滿足於 一個簡單的 網絡流傳很久的 dot(normal,-lightDir)來實現效果。所以準備較為全面細緻的推導這個算法。友情提示:雖然是圖形學分享但本文帶有凡爾賽文學創作元素請小心品嘗。

理論基礎

關於 透射與次表面散射的關係很多人可能含糊不清。先看一張常見的美術想要的SSS效果。相信很多TA在與美術的需求交流中,會分不清他們描述的SSS到底是什麼,是次表面散射?是透射效果(透光而不透明)?其實他們又不是小孩子當然是都要啊 只是沒空去細分而已。那麼如何區分他們呢?目前為止我並未查到言之鑿鑿的清晰分界定義。只能自己根據一些獨立資料嘗試自己的自圓其說,其中很多資源也彼此矛盾,所以不能確保選取組合是完全正確的。先看3個概念。我不翻譯縮寫的全稱和定義,而是用直白的話描述。

BRDF 描述入射表面孤立的反射的情況,這也是unity提供的最常用最基礎模型。不研究折射,物體內部光線傳播等。Standard shader基於此。

BSSRDF 和BRDF 類似但不再孤立的考慮入射表面本身,還會考慮從附近位置反射的情況。但渲染過程是相反的,所以要理解成渲染的表面計算了附近表面入射光 也從我當前渲染表面反射的情況。

BTDF R代表反射所以都不考慮深入的進入物體內部並穿透的情況,所以需要T來描述。在12模型中認為,光線只要沒反射就進入內部被吸收。普通的透明玻璃處理 也是按BRDF計算計算的 只是最終渲染結束後像素混合的時候用了百分比顏色疊加,並非渲染過程的光線考慮。

或許你會看到很多權威文章。配合下面第二張圖。告訴你 BSDF=BRDF+BTDF。那麼 我們關注的次表面 BSSRDF呢?被拋棄了嗎?其實BSSRDF屬於BRDF,只是更通用的解。BRDF就是BSSRDF散射距離為0的特殊情況。因為更大維度上 光線只分反射與折射。

結論

次表面散射 描述的是陰影過渡處,並不生硬。而不是遠離過渡處看到全部區域,常見的耳朵與手掌中間就不是次表面散射的效果了。屬於透射部分的光,發生在任何觀察角度。

透光性 描述的是薄物體透射,描述大量非邊緣區域,只發生在光源在背後的情況。而植被的「SSS」渲染 個人感覺應該重點透光性 畢竟區域大效果明顯 性能高。

光源在背面光源在正面算法分析

我當時拿起一片樹葉在公司樓下站了1小時,關注了2點。

透到背面的光線 是各方向均勻的 還是類似高光以入射光角度為主的傳播?決定算法是否與dot(normal,viewDir)有關

入射光線與表面法線夾角 對於穿透量是什麼一個影響。

對於1 我不太確定需要測量,對於2 我是大體有概念的,垂直照射肯定是透光最多的 。因為垂直通過的距離更短,更重要的一個方面還是 菲涅爾效應。但這也是在學習他之前就可以發現的。坦克斜面裝甲防止高速子彈的穿透,甚至小學之前丟旋轉高速的石子 打水漂。都能發現越接近物體表面越難穿透,這些知識具有普遍性。但具體的關係如何,我還不知道。我會選一種自己喜歡的方式去探索他。一般不是直接查表,而是假模假樣的做點實物測試。我學所有技術的動力與樂趣 都是更好的與真實物理世界對話,而非與他人 或人類知識本身交互。

正式測量

首先準備好測量4件套,角度圖紙,大樹葉,光照度測量儀,手電筒。由於家境貧寒 我沒找到手電筒,用的是 公司今年發的陽光普照獎IPhone12 上的手電筒功能。將就著測吧。話到如此了,順便拉下小夥伴加入我們吧 TA 圖形 程序各崗位都需要,因為項目開發的不錯拿到了騰訊n個億的投資,會開多個高品質項目。坐標杭州。

然後是想辦法把樹葉固定在 紙張量角器的圓心位置。同樣因為家境貧寒,我不可能找到膠帶等現代工業產物的。只好拿出一本自己看透而不再需要的嬰幼兒時期的讀物來固定。如下即可

測試結果 需要關燈 和選擇毛絨環境減少環境反射所以不能拍了 直接寫下測試結果

1 樹葉的透射光線是均勻的與觀察角度無關,也沒有在入射光線上保持更大通光量權重。

2入射角度與樹葉法線夾角分別為(90/平行樹葉 ,60,30,0/垂直)時,樹葉背後光照度分別為0lux 4lux 12lux 15lux,光本身強度為600lux。

有這四個數據,作為老碼農隨便寫4,5行代碼實現擬合工具.我這裡沒有根據泰勒的展開去湊各階導數,也沒根據傅立葉展開去拼n個sin與cos,雖然都可行。但因為我很早就知道是類似菲涅爾現象,而菲涅爾可以可以用 pow(cos(x*f),p)k,來做,k縮放和f頻率是我單位不一致等的考慮。於是很快就得到了 公式。這裡的F=56.9 可能你覺得很奇怪,其實我是用角度做參數,轉成弧度後56.9*3.14159/180=0.993 拋開誤差應該就是1 和菲涅爾公式的單位周期一致。

工程實現與效果

在測量之前我就寫了版經驗公式的效果 先看下

先看 素材的默認BRDF照明(左邊) 和 直接dot(normal,-lightdir)效果 (右邊 2種不同強度)

這種沒考慮陰影的透光效果是很差的,所以前面所有理論 都沒考慮陰影所以真實落地其實需要考慮的更多。陰影的實現forward渲染簡單很多 gi.light.color可直接拿到到陰影結果的光照。deferred需要改 buildin那個Internal-DeferredShading.shader ,還需要往gbuffer加matID,我們是後者麻煩些,但考慮大部分項目都是手遊項目都是forward。所以就只說forward實現了。加上陰影后 這樣了,好看不少。

但是會發現,透光性的物體不僅僅會透背面的光,也會透四周的環境光,所以他不會像實體那麼黑,也就是美術說的通透感,於是又加上陰影減弱。效果就更好了。有點漂亮有沒有哈

但是 只考慮平行光是不夠的,現實中樹葉背後(相對觀察者)各方向的光 都可以造成透光效果。所以正確的做法應該是實現基於IBL的透光計算。但是這個性能就不太好了,所以退一步,用lightprobe的 低頻漫反射描述各方向光強度+平行光實現。以下2張。

只計算平行光透光性的 正面無透光效果用lightprobe 考慮各方向的光+平行光計算 正面也有效果

用上測量公式

測量結果中主要是獲得power的係數 為1.77

以下為算法源碼,(gi.light.color+0.8)/1.8 是利用環繞照明減弱陰影。關於環繞照明多說一句是TA非常常用的小技巧和非常常用的數學思維。格式為 (A+x)/(1+x) .比如 x=0.2情況下當A為0和1時,分別為0.2和1,既不溢出1 又最低值防止0的黑色出現。又比max(0)好的保持了整體過渡而非裁剪。這種思想常常是很多人本身就具備的,記得我最初學圖形接觸 HalfLambert模擬早期GI時 見到floathLambert = difLight * 0.5 + 0.5; 我提成一個思考,為什麼必須是0.5呢,可否是個x 係數 ,變成A*x+(1-x)呢。進一步推導下 令x=1/(1+y) 得到 A/(1+y)+(1-1/(1+y))=A/(1+y)+y/(1+y)=(A+y)/(1+y) ,是不是很熟悉?就是一開始那個 (A+x)/(1+x) 環繞照明。所以說很多數學思路是本身具備不需要全部通過學習的,見到只是重逢自然比重新認識更快理解。但當時能理解這些關係的人不多 我這種提法還被 嘲諷為HaHaLambert(脆弱的小心肝差點放棄圖形哈哈)

//穿透疊加色 後面解釋
float3 addColor =half3(0.15, 0.15, 0.0);

#if 0
//經驗公式
c.rgb += (gi.light.color+0.8)/1.8 *(max(dot(s.Normal, -gi.light.dir),0)) * (s.Albedo + addColor) *pow(dot(s.Normal, viewDir) * 0.5 + 0.5, 1.2);
c.rgb += ShadeSHPerPixel(-s.Normal, 0, 0) * (s.Albedo + addColor) * (saturate( Luminance(gi.light.color) + 0.8) / 1.8;

#else
//測量公式
c.rgb += (gi.light.color+ 0.8) / 1.8 * pow(max(dot(s.Normal, -gi.light.dir), 0), 1.77) *(s.Albedo + addColor);
c.rgb += ShadeSHPerPixel(-s.Normal, 0, 0) * (s.Albedo + addColor) * (saturate(Luminance(gi.light.color)) + 0.8) / 1.8;
#endif
return c;

這裡解釋下 ,穿透疊加色 。就是透光後的顏色應該是什麼顏色呢?獨立設置一個顏色 當然最好,但為了省圖,一般配置個顏色。但是這樣純色又不符合真實,真實情況背面一般比正面淺。所以一般做個通用寫法就是 s.Albedo + addColor 。addColor 一般為0.1到0.2.但是白色會發灰,所以這裡指定half3(0.15,0.15,0.0);其中綠色 是因為背面一般更嫩綠。紅色有而藍色沒有,是因為我們知道光線穿越非真空區域時,波長最長的紅色容易保持原來路線容易繞過障礙。藍色波長短最容易被散射。比如早晚陽光穿大氣層藍色就被散射形成藍色的天空,紅色到達眼睛看起來比較紅。但這裡是我 自圓其說的 主要是這樣調了好看。

最終效果對比

從上至下分別是 沒有透射,經驗公式透射,測量數據透射

可以看到 葉面與視線平行時才有細微差別,ps裡對齊切換會明顯些。說明經驗公式真的很有經驗哈哈。因為提前用大幅度的0.5做了half保護。


聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。

作者:jackie

原文:https://zhuanlan.zhihu.com/p/348259514

More:【微信公眾號】 u3dnotes

相關焦點

  • 學術交流 | 張永軍:多源衛星影像的攝影測量遙感智能處理技術框架與初步實踐
    本文在闡述攝影測量遙感基本概念的基礎上,初步探討了其涉及的主要科學問題及相關研究應用領域,並以多源遙感衛星影像為例構建了一體化攝影測量遙感智能處理技術框架,通過語義信息提取與精準幾何處理的交叉閉環融合,顯著提升了高解析度多源遙感衛星影像精準快速處理的自動化和智能化水平,多個應用實踐初步驗證了相關理論方法的正確性和有效性。
  • 好文推薦 |無人機RGB影像的新型植被覆蓋度估算方法:色彩混合分析
    主題詞植被覆蓋度、無人機、混合像元色彩混合分析、高斯端元隨機變量、最大後驗概率估計植被覆蓋度FVC(Fractional Vegetation Cover)的精準估算與製圖是植被生長狀態監測、關鍵植被生理參數 (葉面積指數、光合有效輻射截獲比)估算、衛星產品真實性檢驗、作物表型等研究與應用的重要環節。
  • 攝影測量和雷射雷達測量哪個好?答案在這
    解析攝影測量的進一步發展是數字攝影測量。具體地說,它是以立體數字影像為基礎,由計算機進行影像處理和影像匹配,自動識別相應像點及坐標,運用解析攝影測量的方法確定所攝物體的三維坐標,並輸出數字高程模型和正射數字影像,或圖解線劃等高線圖和帶等高線的正射影像圖等地理信息。數字攝影測量處理的原始資料是數字攝影。影像分析和影像匹配是攝影處理的重要內容。
  • 飛馬D20航測系統在植被密集區1:500地形圖測繪中的應用
    且此技術也會受畸變因素及光照等天氣因素影響,要保證成圖精度,空中三角測量計算時就需要使用大量像控點。針對這種地貌情況,本文以內蒙古某光伏1:500地形圖測繪項目為例,使用飛馬D20系統搭載DV-LiDAR20雷射雷達模塊進行航空攝影測量。該設備系統和技術可在僅布設少量像控點時進行高效作業。航測外業完成後使用機載雷達點雲直接生成等高線,減少人工編修的工作量。
  • 多樣性算法在58部落的實踐和思考
    於是,如何在準確性和多樣性之間進行權衡和協同優化,從而提高業務的整體數據指標成為了現在推薦系統的又一個優化方向。眾所周知,各種用戶行為(點擊、轉化、停留、分享等等)都可以作為優化準確度的目標,我們可以明確的收集用戶的行為作為模型的目標標籤,從而設計模型並優化。因為多樣性本身是一個集合統計量,很難找到直接的用戶行為來作為模型優化的目標。
  • 一種GPS/GLONASS/INS 數據融合算法
    採用差分自適應檢測算法、改進碼平均相位算法以及位置聯合解算方法實現了GPS/GLONASS數據融合,藉助於改進的粒子濾波器、INS誤差模型建立系統狀態方程和觀測方程,完成GPS/GLONASS系統速度值和INS系統速度值數據融合,提高組合導航系統精度和可靠性。使用真實數據對數據融合算法性能進行仿真分析,結果表明所設計算法是有效的,能夠處理非線性非高斯條件下的濾波估計,提高濾波精度和系統可靠性。
  • 【推薦算法】FFM模型原理和實踐
    由於推薦系統的場景就是特徵的大規模稀疏,由此產生了FM系列算法,包括FM,FFM,DeepFM等算法。似然函數:最大化對數似然函數:加L2正則後,損失函數如下:5 基於tensorflow2.X的ffm模型實踐這裡使用的是Kaggle比賽——Telco Customer
  • 選擇LiDAR還是攝影測量?
    儘管如此,隨著無人機的飛行任務越來越多樣化,採用的技術也在整體優化,這樣的二分法未免過於簡單。但如果工作流程沒錯,集成也做得很好,就像我們這樣,處理LiDAR數據會比攝影測量簡單而且快速得多。」LiDAR 受到顧客青睞的另一個原因是它能夠從非常接近於攝影測量的情形中提取數據。「這一點非常重要,」Legrand說道,「當對一片被植被覆蓋的區域進行測量或測繪時,您可以使用 LiDAR 測量地面。攝影測量就無法做到這一點。」測量狹窄的物體也是LiDAR的強項之一。
  • 光學心率傳感器可以測量什麼?
    加速計 - 加速計可測量運動,與光信號結合運用,作為PPG算法的輸入。算法 - 算法能夠處理來自AFE和加速計的信號,然後將處理後的信號疊加到PPG波形上,由此可生成持續的、運動容錯心率數據和其他生物計量數據。光學心率傳感器可以測量什麼?
  • 重慶市國產GPS_濰坊華測測量儀器設備有限公司
    重慶市國產GPS,濰坊華測測量儀器設備有限公司,(2)我公司對售出的測深儀產品的主機及配套附件保修一年。重慶市國產GPS, 本須知適用於所有按照《暫行規定》頒發無人駕駛航空器系統駕駛員合格證的申請人和對上述申請人實施培訓的訓練機構,實踐考試應按照新頒布的實踐考試標準來實施。
  • 車輛定位算法展望
    前面提到的所有場景都應用了傳感器融合技術,也有一些利用傳感器融合計算出無法直接測量或識別的狀態量或物體的實例,如基於攝像頭的障礙物、行人檢測;利用輪速傳感器進行胎壓和路面附著係數的估計等。我們的方法依賴信號數據處理技術、車輛運動學模型和傳感器。需要注意的是,道路地圖信息是非線性的,不能用線性高斯模型近似,因此粒子濾波(PF)架構要優於卡爾曼濾波(KF)算法。傳感器融合架構見下圖。
  • 2D雷射SLAM算法匯總
    Gmapping在RBPF算法上做了兩個主要的改進:改進提議分布和選擇性重採樣。Gmapping可以實時構建室內地圖,在構建小場景地圖所需的計算量較小且精度較高。需具備高更新頻率且測量噪音小的雷射掃描儀,所以,在製圖過程中,robot的速度要控制在較低的情況下才會有比較理想的建圖效果,這也是它沒有迴環的一個後遺症。另外在裡程計數據比較精確的情況下無法有效利用裡程計信息。
  • deep-sort 算法
    基於深度學習的多目標跟蹤算法的幾種改進方向,其中有一種便是將深度表觀特徵應用到多目標跟蹤問題中,deep-sort多目標跟蹤算法便是這類算法中較為常用的一個
  • 推薦系統常用的推薦算法
    /(點擊尾部閱讀原文前往)《推薦系統算法初探》《推薦系統的典型推薦案例》《美團推薦算法實踐》《TOP 10開源的推薦系統簡介》《各廠推薦算法體會》《常用推薦算法》(6)健壯性:比如針對關聯推薦算法,商戶惡意下單提高產品的推薦頻率,水軍惡意評論等。二、靜態數據推薦基本上絕大多數算法都會利用用戶-產品的交互數據動態生成個性化的推薦。
  • 推薦系統 Embedding 技術實踐總結
    在工程實踐上其優越性也得到了證明(BERT 在多個 NLP 任務中也表現優異)。我們的召回實踐多數用的單 embedding,少量用到了多 embedding。兩種方法我們都做了實踐。該算法亦有顯著提升,已鋪量使用。
  • 意法半導體(ST)推出Always-On慣性測量單元 提高測量精度,優化系統功耗
    片上大容量FIFO存儲器和速率更快的串行接口讓傳感器高效工作,延長系統睡眠時間意法半導體的LSM6DSO iNEMO™慣性測量單元
  • 推薦 :如何正確選擇聚類算法?
    —層次聚類、基於質心的聚類、最大期望算法和基於密度的聚類算法,並討論不同算法的優缺點。聚類算法十分容易上手,但是選擇恰當的聚類算法並不是一件容易的事。數據聚類是搭建一個正確數據模型的重要步驟。數據分析應當根據數據的共同點整理信息。然而主要問題是,什麼通用性參數可以給出最佳結果,以及什麼才能稱為「最佳」。本文適用於菜鳥數據科學家或想提升聚類算法能力的專家。下文包括最廣泛使用的聚類算法及其概況。根據每種方法的特殊性,本文針對其應用提出了建議。聚類模型可以分為四種常見的算法類別。