日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

渲染系列教程(十八)实时全局光照

發布時間:2023/12/31 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 渲染系列教程(十八)实时全局光照 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

譯者: 崔嘉藝(milan21)

審校:王磊(未來的未來)

?

  • 對實時全局光照的支持。

  • 在全局光照里面對自發光的貢獻做動畫控制。

  • 使用光照探測代理體。

  • 將LOD組與全局光照結合使用。

  • LOD不同等級之間的淡入淡出。

?

這是關于渲染基礎的系列教程的第十八部分。在前面的部分里我們對烘焙好的全局光照進行了支持,現在,我們將支持光照探測代理體以及LOD組的淡入淡出。

?

系列回顧:

Unity 渲染教程(一):矩陣

Unity 渲染教程(二):著色器基礎

Unity 渲染教程(三):使用多張紋理貼圖

Unity 渲染教程(四):第一個光源

Unity 渲染教程(五):多個光源

Unity 渲染教程(六):凹凸度

Unity 渲染教程(七):陰影

Unity?渲染教程(八):反射

Unity 渲染教程(九):復雜材質

Unity 渲染教程(十):更多復雜的應用場景

Unity 渲染教程(十一):透明度

Unity 渲染教程(十二):半透明材質的陰影

Unity 渲染教程(十三):延遲渲染

Unity 渲染教程(十四):霧

Unity 渲染教程(十五):延遲光源

Unity 渲染教程(十六):靜態光照

Unity 渲染教程(十七):混合光照

?

從現在開始,這個系列教程將由Unity 2017.1.0f3來完成。它將不適用于Unity的舊版本,因為我們要使用一個新的著色器函數。

?

靜態LOD組和實時全局光照混合后的結果。

?

實時全局光照

?

烘焙光照在靜態幾何體上工作的非常好,對于動態幾何體,由于有光探測器的緣故,烘焙光照這種方法也能工作的非常好。但是,烘焙光照不能處理動態光源。混合模式的光源可以通過一些實時的調節來消除,但調節的太多使得烘焙出來的間接光照不會改變。所以當你有一個戶外場景的話,使用烘焙光照這種方法太陽的光照就不能有變化。太陽不能像在現實生活中一樣在天空中移動,因為如果需要太陽在天空中移動的話,就需要逐漸變化的全局光照。所以場景必須一直不變。


為了使間接光照能夠在移動的太陽這樣的情況發揮作用,Unity使用Enlighten系統來計算實時全局光照。除了在運行時計算光照和光探測器以外,它就采用烘焙間接光照一樣的方式來工作。

?

了解間接光需要知道光在靜態表面之間如何反射。重點在于哪些表面可能會受到其他表面的影響,以及程度如何。弄清這些關系需要做很多的工作,不能實時完成。所以這個數據由編輯器處理并存儲在運行時使用。?Enlighten系統然后使用這個數據來計算實時光照貼圖和探測數據。即使如此,只有低分辨率的光照貼圖才可以在實時情況下運行。

?

啟用全局光照

?

實時全局光照可以獨立于烘焙光照啟用。你可以同時啟用兩個,或者啟用其中的一個,或者兩個都不啟用。這兩個選項都是通過“光照”窗口的“實時照光照”部分中的復選框啟用。

?

實時全局光照和烘焙光照同時啟用的狀態。

?

要實際查看實時全局光照,請將測試場景中的主光源的模式設置為實時模式。 由于我們沒有其他光源,即使啟用了烘焙光照也能有效地關閉。

?

主光源設置為實時模式。

?

確保場景中的所有對象都使用我們的白色材質。 像上次一樣,球體都是動態的,而其他的都是靜態幾何體。

?

只有動態對象能接收實時的全局光照。

?

事實證明,只有動態對象會受益于實時全局光照。靜態物體會變的暗一點。這是因為光探測器自動并入實時全局光照。而靜態對象必須對實時的光照貼圖進行采樣,而這些光照貼圖與烘焙的光照貼圖不同。我們的著色器還沒有這樣做。

?

烘焙的全局光照

?

Unity在編輯模式下已經生成了實時的光照貼圖,所以你可以隨時查看實時的全局光照的貢獻。在編輯模式和播放模式之間進行切換的時候,這些貼圖不會被保留,但是它們最終會得到相同的結果。你可以通過“光照”窗口的“對象貼圖”選項來選擇一個光照貼圖靜態對象對實時光照貼圖進行檢查。 選擇“實時強度“可以可視化的查看實時光照貼圖的數據。

?

實時光照貼圖,屋頂被選中時候的狀態。

?

雖然實時光照貼圖已經被烘焙出來,并且它們還可能顯示正確,但我們的meta渲染通道實際上使用的是錯誤的坐標。實時全局光照具有自己的光照貼圖坐標,最終可能與靜態光照貼圖的坐標不同。Unity會根據光照貼圖和對象的設置來自動生成這些坐標。這些數據存儲在第三個網格的UV通道中。所以將這些數據添加到My Lightmapping中的VertexData里面。

?

?

現在,MyLightmappingVertexProgram必須使用第二個或是第三個UV坐標,以及靜態或動態光照貼圖的大小和偏移量。 我們可以依靠UnityMetaVertexPosition函數來使用正確的數據。

?

?

UnityMetaVertexPosition是什么樣子的?

?

它除了通過unity_MetaVertexControl提供的標志來決定使用哪些坐標集和光照貼圖之外,它還做了我們以前做的工作。

?

?

請注意,meta渲染通道既用于烘焙光照貼圖,也用于實時光照貼圖。所以當使用實時全局光照的時候,meta渲染通道也將被包含在構建中。

?

對實時光照貼圖進行采樣

?

為了對實時光照貼圖進行采樣,我們還必須將第三個UV坐標添加到My Lightmapping中的VertexData里面。

?

?

當一張實時光照貼圖被使用的時候,我們必須將這個光照貼圖的坐標添加到我們的插值器中去。標準著色器在單個插值器中將兩個光照貼圖的坐標集合組合起來?-?與其他數據復用?-?但是我們可以為兩者準備單獨的插值器。當DYNAMICLIGHTMAP_ON關鍵字被定義的時候,我們知道有動態光照數據。它是multi_compile_fwdbase編譯器指令的關鍵字列表的一部分。

?

?

填充坐標就像對靜態光照貼圖的坐標所做的事情一樣,除了動態光照圖的縮放比例和偏移量的設置以外,這些可以通過unity_DynamicLightmapST變得可用。

?

?

對實時光照貼圖的采樣是在我們的CreateIndirectLight函數中完成的。復制?#if defined(LIGHTMAP_ON)?代碼塊并進行一些更改。 首先,新的部分是基于DYNAMICLIGHTMAP_ON關鍵字的。 此外,它應該使用DecodeRealtimeLightmap而不是DecodeLightmap,這是因為實時光照貼圖使用不同的顏色格式。而且因為這些數據可能被添加到烘焙光照中,不要立即分配給indirectLight.diffuse,而是使用最后添加的中間變量。 最后,當不使用烘焙光照貼圖和實時光照貼圖的時候,我們只應該對球面諧波進行采樣。

?

?

把實時全局光照應用于一切物體之上。

?

現在我們的著色器使用的是實時光照貼圖。最初,當使用Distance?Shadowmask模式的時候,它的效果可能看起來與使用混合光源的烘焙光照的效果相同。當在播放模式下關閉光源的時候,差異就變得非常明顯。

?

禁用混合光源以后,間接光照仍然被保留。

?

禁用混合光源以后,其間接光照將保持不變。相比之下,實時光照的間接貢獻就會消失,并重新出現?-?這是應該出現的情況。 不過,新情況的完全烘焙好可能需要一段時間。?Enlighten系統會逐步調整光照貼圖和光探測器。 這種情況發生的速度取決于場景的復雜性和實時全局光照CPU質量設置。

?

切換實時光源與實時全局光照。

?

所有實時光源都對實時全局光照有貢獻。 然而,它的典型用途是那些僅在主要方向上存在光線的光源,比如可以代表太陽,因為它在天空中移動。它適用于方向光源。點光源和聚光光源也能工作,但只是沒有陰影。所以當使用帶有陰影的點光源或聚光光源的時候,你可能會遇到不正確的間接光照結果。

?

沒有影響的間接光源和實時的聚光光源。

?

如果要從實時全局光照里面去掉一個實時光源,可以通過設置它的Indirect Multiplier將它的光強度設置為零。

?

自發光光源

?

實時全局光照也可以用于自發光的靜態物體。這使得可以匹配實時間接光照來改變物體的自發光變得可能。讓我們來試試看吧。向場景中添加一個靜態球體,并賦予它一個使用我們著色器的材質,這個材質具有黑色的反照率和白色的自發光顏色。最初,我們只能看到通過靜態光照貼圖實現的自發光的間接效果。

?

用自發光球來烘焙全局光照。

?

要將自發光光源烘焙到靜態光照貼圖中,我們必須在我們的著色器的GUI中設置材質的全局光照標志。因為我們總是將標志設置為BakedEmissive,光源最終將以烘焙好的光照貼圖的形式出現。如果自發光光源是恒定的這個效果是很不錯的,但這樣就不允許我們做動畫控制。

?

為了同時對自發光光源支持烘焙和實時光照,我們必須使其可配置化。我們可以通過向MyLightingShaderGUI中添加一個選項來做到這一點,使用的是MaterialEditor.LightmapEmissionProperty方法。這個方法的單個參數是屬性的縮進級別。

?

?

每次當自發光屬性發生改變的時候,我們也必須停止覆蓋這個標志位。其實真正要做的事情比這更復雜一點。其中一個標志選項是EmissiveIsBlack,這個表示表示的是自發光計算可以跳過。這個標志總是會針對新材質進行設置。要讓間接自發光能夠工作,我們必須保證這個標志不被設置,無論我們選擇實時光照還是烘焙。我們可以通過總是屏蔽標志值的EmissiveIsBlack位來做到這一點。

?

?

帶有自發光球的實時全局光照效果。

?

烘焙全局光照和實時全局光照之間的視覺差異主要是因為實時光照貼圖通常具有比烘焙全局光照更低的分辨率。所以當自發光不發生不變化的時候,你也可以使用烘焙全局光照,確保能夠利用其更高的分辨率。

?

EmissiveIsBlack的目的是什么?

?

這是一個優化,使得計算可以跳過全局光照烘焙過程。然而,只有當自發光顏色確實是黑色的時候,它才依賴于標志。由于這個標志位由著色器的GUI進行設置,這是當材質在檢視器里面進行編輯的時候確定的。或者至少,這是Unity的標準著色器的做法。因此,如果自發光顏色稍后被腳本或動畫系統更改,則該標志位不會做相應的調整。這是許多人不理解為什么對自發光做動畫不會影響到實時全局光照的原因。結果就是如果你想在運行時更改自發光顏色,那么就不要將自發光顏色設置為純黑色。

?

我們沒有使用這種方法,我們使用的是LightmapEmissionProperty,它還提供了對自發光完全關閉全局光照的選項。 所以這個選擇對于用戶來說是非常明確的,沒有任何隱藏的行為。如果用戶不要使用自發光? 那么只要確保它的全局光照被設置為None就可以了。

?

對自發光進行動畫控制

?

用于自發光的實時全局光照只能用于靜態對象。雖然物體是靜態的,但其材質的自發光屬性還是可以被動畫化,并且將被全局光照系統所捕獲到。讓我們用一個在自發光顏色為白色和自發光顏色為黑色之間振蕩的簡單組件來嘗試下這個事情。

?

?

將這個組件添加到我們的自發光球體。在播放模式下,自發光將會動畫化,但間接光照不受影響。我們必須通知實時光照系統,它有工作要做。這可以通過調用適當網格渲染器的Renderer.UpdateGIMaterials方法來完成。

?

?

調用UpdateGIMaterials方法會觸發物體自發光的完整更新,并使用其meta渲染通道進行渲染。當自發光比純色更復雜的時候,這是必要的,舉個簡單的例子來說,比如說我們使用紋理。如果一個純色就足夠了,那么我們可以通過使用渲染器和自發光顏色調用DynamicGI.SetEmissive方法來得到一個比較快捷的計算方式。這比使用meta渲染通道來渲染物體更快,所以在能夠使用的時候可以利用這種方法。

?

?

光照探測代理體

?

烘焙全局光照和實時全局光照都通過光探測器應用于動態對象。物體的位置用于對光探測數據進行插值,然后將其用于全局光照。這對于相當小的物體來說下效果很好,但對于較大的物體來說就太粗糙了。

?

舉個簡單的例子來是說,將做了比較大拉伸的立方體添加到測試場景,以便它可以受到不同的光照條件的影響。它應該使用我們的白色材質。由于它是一個動態立方體,所以最終使用一個點來確定它的全局光照貢獻。讓我們移動這個點的位置,使得這一點最終處于一個被遮蔽的位置,那么整個立方體就會變黑,這顯然是錯誤的。為了使這一點非常明顯,讓我們使用一個烘焙主光源,所以所有光照都來自烘焙全局光照和實時全局光照的數據。

?

對于大型動態物體來說,光照效果不好。

?

為了使光照探測器適用于這樣的情況,我們可以使用光照探測代理體,或者簡稱為LPPV。這可以通過向著色器發送插值后的探測器數據網格而不是單個插值后的探測器數據來做到。這需要具有線性濾波的浮點數3D紋理,這就將這個方法限制到只能在現代顯卡上使用。此外,還要確保在圖形層設置中啟用LPPV(光照探測代理體)支持。

?

啟用了LPPV(光照探測代理體)支持。

?

向物體中添加一個光照探測代理體

?

光照探測代理體可以以各種方式設置,最直接的方法是在作為使用光照探測代理體的物體的一個組件。你可以通過Component / Rendering / Light Probe Proxy Volume來添加它。

?

光照探測代理體組件。

?

LPPV(光照探測代理體)通過在運行時在光探測器之間進行插值來工作,就好像它們是常規動態對象的網格一樣。插值后得到的結果被緩存,刷新模式(Refresh Mode)控制在何時進行更新。默認值為“自動(Automatic)”,這意味著當動態全局光照更改和探測器組發生移動的時候會觸發更新。包圍盒模式(Bounding Box Mode)控制著代理體的定位。自動本地化(AutomaticLocal?)意味著它會去匹配其附著的對象的包圍盒。這些默認設置適用于我們的立方體,因此我們將保留這些設置。

?

要使我們的立方體實際使用LPPV(光照探測代理體),我們必須將其網格渲染器的光探測器(Light Probes)模式設置為使用光照探測代理體(Use ProxyVolume)。默認行為是使用對象本身的LPPV(光照探測代理體)組件,但也可以強制使用另一個代理體。

?

使用一個光照探測代理體而不是常規的探測器。

?

自動分辨率模式(automaticresolution mode)對于我們的拉伸立方體不起作用。 因此,將“分辨率模式(Resolution Mode?)”設置為“自定義(Custom?)”,并確保立方體的角上有采樣點,并沿著其長邊有多個樣本點。當你選中這個對象的時候,可以看到這些采樣點。

?

自定義探測器分辨率以適應拉伸的立方體。

?

對光照探測代理體進行采樣

?

立方體已變黑,因為我們的著色器現在還不支持LPPV(光照探測代理體)采樣。為了使其工作,我們必須在CreateIndirectLight函數內調整球面諧波代碼。當使用LPPV(光照探測代理體)的時候,UNITY_LIGHT_PROBE_PROXY_VOLUME被定義為1。我們在這種情況下什么都不做,看看會發生什么。

?

?

沒有更多球面諧波的效果。

?

得到的結果是所有的球面諧波被禁用,對于不使用LPPV(光照探測代理體)的動態對象也是如此。這是因為UNITY_LIGHT_PROBE_PROXY_VOLUME在項目范圍內定義,而不是對每個對象實例進行定義。單個對象是否使用LPPV由UnityShaderVariables中定義的unity_ProbeVolumeParams的X分量指定。如果unity_ProbeVolumeParams的X分量設置為1,那么我們有一個LPPV(光照探測代理體),否則我們應該使用常規的球面諧波。

?

?

要對光照探測代理體進行采樣,我們可以使用SHEvalLinearL0L1_SampleProbeVolume函數而不是ShadeSH9。這個函數在UnityCG中進行定義,并且需要世界空間中的位置作為額外的參數。

?

?

SHEvalLinearL0L1_SampleProbeVolume如何工作?

?

顧名思義,該函數僅包括前兩個球面諧波帶L0和L1。?Unity不使用LPPV(光照探測代理體)的第三個波帶。所以我們得到較低質量的光照近似值,但是我們在多個世界空間中的樣本之間進行插值,而不是使用單個點。下面是這個函數的代碼。

?

?

采樣后的LPPV(光照探測代理體)的效果,在伽馬空間中的效果太暗。

?

我們的著色器現在在需要的時候對LPPV(光照探測代理體)進行采樣,但結果太暗了。至少在伽馬顏色空間中工作就是這樣的結果。這是因為球面諧波數據存儲在線性空間中。因此,可能需要進行顏色的轉換。

?

?

采樣后的LPPV(光照探測代理體)的效果,帶有正確的顏色。

?

LOD組

?

當一個對象最終只覆蓋應用程序窗口的一小部分的時候,你不需要高度詳細的網格來渲染它。你可以根據對象在視圖中的大小使用不同的網格。這被稱為細節層次,或簡稱LOD。Unity允許我們通過組件LOD組來實現這樣的功能。

?

創建一個LOD層次結構

?

這個想法是你在各種不同的LOD等級使用同一網格的多個版本。最高級?- LOD 0 -?具有最多的頂點、子對象、動畫、復雜的材質等。隨后的級別逐漸變得更簡單,更容易計算。在理想情況下,相鄰的LOD等級被設計為使得當Unity從一個LOD等級切換到另一個LOD等級的時候,你不能輕易地辨別出它們之間的區別。否則突然有LOD等級變化的時候就會讓人很暈。但是在研究這種技術的時候,我們會使用明顯的不同的網格。

?

創建一個空的游戲對象并給它兩個子對象。第一個子對象是標準球體,第二個子對象是標準立方體,其大小設置為0.75。 預期的結果看起來像是一個重疊的球體和立方體。

?

球體和立方體作為一個對象。

?

通過Component /Rendering / LOD Group將一個LOD組組件添加到父對象。你會得到一個具有默認設置的LOD組,它有三個LOD等級。 百分比是指由對象的包圍盒覆蓋的窗口的垂直部分。因此,當垂直尺寸下降到窗口高度的60%的時候,默認設置為切換到LOD 1,當垂直尺寸下降到窗口高度的30%的時候,默認設置為切換到LOD 2。當垂直尺寸下降到窗口高度的10%的時候,它根本不渲染。 你可以通過拖動LOD框的邊來更改這些閾值。

?

組件LOD組。

?

這些閾值由LOD偏移(LOD Bias)進行修改,LOD偏移(LOD Bias)可以在組件檢視器里面查看并修改。目前使用的是質量設置為2的默認值,這意味著閾值被減半。也可以設置為最大LOD等級,這將導致跳過最高級別。

?

為了使其工作,你必須告訴組件每個LOD等級都會使用哪些對象。這是通過選擇一個LOD塊并將對象添加到其“渲染器”列表中完成的。你可以在場景中添加任何對象,但一定要確保添加其子對象到LOD塊的“渲染器”列表。讓LOD 0的“渲染器”使用球體,讓LOD 1的“渲染器”使用立方體。我們將LOD 2的“渲染器”留空,所以我們只有兩個LOD等級。如果需要的話,你可以通過右鍵單擊上下文菜單刪除并插入LOD等級。

?

讓球這個子物體使用LOD 0等級。

?

一旦配置了LOD等級,你可以通過移動相機來查看它們的效果。如果物體足夠大的話,它將使用球體,否則的話它將使用立方體,或根本不會渲染。

?

LOD等級切換的效果如這個鏈接所示:https://gfycat.com/gifs/detail/ShyAffectionateFairyfly。

?

烘焙全局光照和LOD組

?

因為LOD組是如何渲染的取決于它的視圖大小,所以它們自然是動態的。但是,你仍然可以使其成為靜態。對整個對象層次結構執行此操作,因此也包括了根節點和它的兩個子節點。然后設置主光源為烘焙光源,看看會發生什么。

?

使用烘焙光源得到的效果。

?

看起來在烘焙靜態光照貼圖的時候使用的是LOD0。 我們最終總是能夠看到球體的陰影和間接光照的貢獻,即使LOD組切換到一個立方體或是對自身做了剔除。但請注意,立方體也是使用了靜態光照貼圖。 所以它不使用光探測器,對吧? 轉動光探測器組就能發現這一點。

?

沒有光探測器時候的烘焙光照。

?

禁用光探測組會使得立方體變得更暗。這意味著他們不再接受間接光照。 這是因為在烘焙過程中確定間接光照的時候使用的是LOD 0。為了找到其他LOD等級下的間接光照,?Unity可以做到的最好程度是依靠烘焙光探測器。 因此,即使在運行時我們不需要光探測器,我們也需要光探測器來為我們的立方體計算間接光照。

?

實時全局光照和LOD組

?

當只使用實時全局光照的時候,方法是類似的,除了我們的立方體現在在運行時使用的是光探測器。你可以通過選擇球體或立方體來驗證這一點。選擇立方體后,你可以看到小工具顯示了哪些光探測器被使用。 球體不顯示它們,因為它使用的是動態光照貼圖。

?

LOD 1使用光探測器來計算實時全局光照。

?

當烘焙全局光照和實時全局光照同時使用的時候,它會變得更加復雜。 在這種情況下,立方體應該對烘焙全局光照使用光照貼圖,對實時全局光照使用光探測器。不幸的是,這是不可能的,這是因為光照貼圖和和球面諧波不能同時使用。這是一個非此即彼的問題。因為光照貼圖數據對于立方體來說是可用的,所以Unity最終會使用它。因此,立方體不受實時全局光照的影響。

?

僅對LOD 1等級使用烘焙光照,使用的是低強度的主光源。

?

一個重要的細節是,烘焙的LOD等級和渲染的LOD等級是完全獨立的。 他們不需要使用相同的設置。如果實時全局光照最終比烘焙全局光照更重要,你可以強制立方體使用光探測器,確保它對于光照貼圖來說不是靜態的,同時保持球體靜止。

?

LOD 1強制使用光探測器。

?

在不同的LOD等級切換的時候支持淡入淡出功能

?

LOD組這種方法的缺點是,當LOD等級發生變化的時候,它可以在視覺上很明顯的表現出來。幾何體會在視圖中突然彈出、消失或改變形狀。 這可以通過相鄰LOD等級之間的淡入淡出來緩解,這通過將LOD組的漸變模式設置為淡入淡出來完成。還有另一種漸變模式,由Unity用于SpeedTree對象,我們不會使用這種模式。

?

當啟用淡入淡出的時候,每個LOD等級都會顯示一個淡入變換寬度(Fade Transition Width?)字段,用于控制其塊的哪個部分用于衰落。舉個簡單的例子來說,當設置為0.5的時候,一半LOD范圍將用于淡出到下一級。或者,淡入淡出過程可以是有動畫的,在這種情況下,在LOD等級之間的切換需要大約半秒鐘。

?

帶有0.5變換寬度的淡入淡出。

?

當啟用淡入淡出的時候,在LOD組之間進行轉換的時候會同時渲染兩個LOD等級。

?

支持淡入淡出

?

Unity的標準著色器在默認情況下是不支持淡入淡出的。如果想要支持支持淡入淡出的話,你必須復制標準著色器并為LOD_FADE_CROSSFADE關鍵字添加一個多編譯指令。添加這條指令還有一個原因是為了在My First Lighting著色器里面支持淡入淡出功能。讓我們將這條指令添加到除了meta渲染通道以外的所有渲染通道。

?

?

我們將使用抖動來在LOD等級之間進行轉換。這種方法適用于前向渲染和延遲渲染,也適用于有陰影的情況。

?

在創建半透明陰影的時候,我們已經使用了抖動這種方法。它需要片段的屏幕空間坐標,這迫使我們為頂點程序和片段程序使用不同的插值器結構。所以讓我們復制My Lighting?中的Interpolators結構,將其重命名為InterpolatorsVertex。

?

?

當我們必須進行淡入淡出處理的時候,片段程序的插值器里面必須包含vpos,否則我們可以使用同樣的位置信息。

?

?

我們可以在我們片段程序中開始的位置使用UnityApplyDitherCrossFade函數來執行淡入淡出操作。

?

?

UnityApplyDitherCrossFade是如何工作的?

?

這個函數在UnityCG中進行定義。它的方法類似于我們在《渲染12:半透明陰影》中使用的抖動方法,區別只是整個對象的抖動級別是均勻的。 因此,不需要混合抖動級別。 它使用存儲在4×64大小的二維紋理中的16個抖動級別,而不是4×4×16大小的三維紋理。

?

?

unity_LODFade變量在UnityShaderVariables中進行定義。它的Y分量包含的是對象的漸變量,共有十六步。

?

通過抖動方法得到的淡入淡出幾何體。

?

淡入淡出現在可以在幾何體上正常工作了。為了使其適用于陰影,我們必須調整My Shadows著色器。 首先,當我們進行淡入淡出處理的時候,必須使用vpos。其次,我們還必須在片段程序開始的位置使用UnityApplyDitherCrossFade函數。

?

?

對幾何體和陰影都做了淡入淡出處理。

?

因為立方體和球體相互交叉,所以我們在對它們做淡入淡出處理的時候,得到一些奇怪的自陰影效果。這對于看到淡入淡出處理能在陰影上起作用是很方便的,但是當你為實際游戲創建LOD幾何體的時候,你必須注意這些瑕疵。

?

下一個教程將覆蓋更多的渲染技術。

總結

以上是生活随笔為你收集整理的渲染系列教程(十八)实时全局光照的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。