2017年7月23日 星期日

Unity即將停止支援DirectX 9

作者:Martin Gram 原文
潤稿:Kelvin Lo


從Unity 2017.3開始,將不再支持Windows平台的DirectX 9 API。意思就是到時候Unity編輯器預設不支援Windows XP了。

執行版本

Unity 2017.3

不再支援的原因

由於微軟官方也不再為Windows XP提供支援,加上使用Windows XP的系統硬體也越來越少,許多Unity的新功能也和這個API不相容,同時維護好幾個不同的DirectX API版本(9、11及12)的難度也越來越高。所以我們決定停止支援DirectX 9 API。


參考數據:

全球的DX9圖形API的使用率大約占比5.1%,但根據遊戲
平台Steam上的統計顯示,截止2017年6月DX9 GPU使用只占了0.37%。


接下來的計畫

我們將從Unity 2017.3開始,取消對DirectX 9的支援,屆時Unity編輯器與發佈的PC平台都將不支援DirectX 9 API。

另外,我們發現許多已知的DirectX 11當機問題,都是由於Driver驅動程式未更新到新版導致。我們正在思考避免這種問題造成當機的解決方法,並能反饋問題給我們來第一時間修復。
如果你有以下問題可以聯繫我們反饋意見:
  • 你的工作流程或現有設定必須繼續使用DirectX 9
  • 你遇到一些Bug或功能行為必須使用“-force-d3d9”命令列參數,將圖形API降級為DirectX 9才能解決
可以從這個論壇反應(英文)

對Windows XP的支援

雖然未來Unity編輯器預設不再支援DirectX 9 API,但不代表WindowsXP就不能執行可執行檔專案。你可以在Unity裡面把Windows採用的圖形API手動改為採用OpenGL。步驟如下:
  1. 從Edit > Project Settings > Player,找到Player Rendering Settings設定
  2. 取消勾選Auto Graphics API for Windows ,並選擇OpenGL作為Windows平台的圖形API


請注意:電腦必須有DirectX 10或Open GL 3等級以上的GPU,最好驅動程式也不要太舊(2010年以後的理論上就能執行),以確保Windows XP能夠支援OpenGL。

參考數據:

2017年7月19日 星期三

WebGL 2.0支援Linear Rendering線性渲染

作者:Christophe Riccio 原文

Unity 2017.2裡面有一個新功能就是WebGL 2.0支援線性渲染(Linear rendering)。有了這個功能你就可以確保輸入和輸出計算都會在正確的顏色空間裡。最後的圖形亮度會根據場景中的光照數量線性變化,代表場景與模型的光照效果會更自然。



上圖左邊是線性漸變,右邊是眼睛所觀察到的漸變,注意中間灰色部分與漸變邊緣的融合。


我們在Unity 5.5中幫Android平台的OpenGL ES 3.0與iOS平台的Metal加上了對linear rendering的支援。在Unity 2017.2裡線性渲染將支援以下平台:
  • Windows、Mac OS X與Linux(PC端)
  • Xbox One
  • PlayStation 4
  • Android平臺OpenGL ES 3.0及Vulkan圖形API
  • iOS平臺Metal圖形API
  • WebGL 2.0
線性渲染功能強大,有了它就可以搭配Unity官方的Post-Processing Stack後製處理特效一起使用,處理像是反鋸齒(Temporal AA)等,在WebGL平台上實現無比驚豔的效果。

還是有些效能問題需要注意。我們與Khronos WebGL團隊合作對WebGL 2.0進行了延展,加入了對sRGB DXT貼圖壓縮格式的支援。如果所使用的網頁瀏覽器不支援這個功能,Unity將解壓縮sRGB DXT格式的貼圖,會有明顯的消耗。

目前支援WebGL 2.0線性渲染的瀏覽器包括最新版的Google Chrome和Firefox。

下載Unity 2017.2測試版

2017年7月12日 星期三

Unity 2017.1正式版發佈

作者:Alex Lian 原文
潤稿:Kelvin Lo



Unity 2017.1正式版已發佈,現在就可以從這裡下載。感謝Unity社群在測試期間所給出的各種有價值的建議。

版本發佈也代表Unity 2017產品循環的開始,將全球最受歡迎的引擎繼續變好,最重要的是幫助開發者更方便開發並獲得成功。

我們希望為美術、企劃和開發者們提供強大的新視覺化工具,讓整個團隊工作效率更高更順。透過改進圖形品質和執行效能來幫助大家創造令人驚豔的3A級體驗。

效能方面我們希望幫助開發者有效利用最新的GPU和圖形API,第一時間能發佈在所有平台(PC、遊戲機、手機、VR、AR、電視等等)。以此為初衷,我們建立了Unity強大的跨平台架構“一次構建,全平台發佈”。我們與全球技術合作夥伴緊密合作,幫助大家落地到各個平台的用戶,將成功機率最大化。

成功的範圍包括營收、內建的Ads廣告、IAP和在Unity 2017中提供的即時操作分析服務(Live-Ops Analtyics)。它們幫你提供更多機會,即時優化遊戲效能且不需要重新打包,利用數據的力量來實現最大化利益。

Unity 2017.1適用於所有Personal個人版,Plus加強版和Pro專業版的訂閱用戶。至於舊的Unity 5買斷授權的用戶請注意,Unity 5.6是5.x產品週期中最後一個版本。Unity 2017已經無法更新上去。如果想繼續獲得更新版本,請聯繫經銷商購買新授權。

我們也非常期待廣大Unity社群開發者能用Unity 2017創作令人驚奇的內容!想了解未來有甚麼功能可以關注Unity版本發佈計畫圖

接下來為大家介紹Unity 2017產品週期第一個版本所有新功能與改進。

Unity 2017.1簡介


Unity 2017.1中包含大量新功能與改進。主要內容如下:

美術和設計師們:全新的敘事系統和運鏡系統

Unity 2017.1為美術和設計師們提供了全新的工具,使用Timeline,Cinemachine和Post-processing工具,可以創造令人驚歎的電影等級畫面與後製鏡頭畫面,並視覺化描述故事。

Timeline是一款強大的視覺化創作工具,用來建立電影等級內容,例如過場動畫、預告片、鏡頭運鏡順序等等。

Cinemachine是一個運鏡系統,您可以像電影導演一樣,在Unity中運用各種鏡頭,而且不需要寫任何程式,引領您進入程式化攝影時代。

Post-processing可以很方便的為場景加上各種逼真濾鏡,使用電影工業級技術、選項和顏色空間格式來創造高品質視覺效果,讓畫面更生動、更逼真,助您描繪更好的視覺故事。

效率:協作、即時操作分析、工具


我們發佈了Unity Teams,它由一系列功能和解決方案,包含Collaborate多人協作和Cloud Build雲構建。

即時操作分析系統引入了新的、更簡單的方法,幫您更了解玩家,並在不需要重新打包的情況下,對遊戲做出即時的反應和調整。

最重要的是,Unity 2017.1對編輯器進行了大量更新,包括對FBX匯入、動畫工作流程、2D功能、Asset Bundle和Visual Studio整合的改進。

圖形與平台:全面改進


Unity 2017.1對粒子系統和漸進式烘焙光照(Progressive Lightmapper)做了大量改進,現在有更多選擇來實現您的藝術願景並保持效能。不同平台可採用不同的渲染加強選項,例如iOS平台上的Deferred Rendering,和PC上的NVIDIA VRWorks。

這些都只是Unity 2017.1的重點介紹,接下來會一一介紹完整豐富的細節內容!


Unity 2017.1新看點
藝術家敘事工具: Timeline和Cinemachine介紹

設計師、美術或動畫師們可以使用新的敘事工具,自己製作電影內容和遊戲分鏡,不在需要仰賴程式設計師幫你調。這代表著開發效率更高,且省下溝通成本。

Timeline是一款強大的視覺化新工具,可用於建立影視內容(例如短片《Adam》)。透過編排遊戲物件、動畫、聲音和場景,來建立過場動畫、遊戲影片等等。有了Timeline,您可以把時間花在敘事內容和電影藝術創作,而不是寫程式。

Timeline基於軌道的鏡頭序列工具,用拖放操作來編排動畫、聲音、事件、影片等元素,可以快速建立漂亮的過場動畫和程式化內容。Timeline有許多功能,例如動畫、音訊、自動關鍵幀,以及可以鎖定或靜音特定軌道的多軌操作介面。Timeline可通過Playable API進行擴展,支援建立自訂軌道,來驅動遊戲中的任何系統。您可以製作一個Timeline剪輯來驅動幾乎所有內容,並且可以重複播放、縮放和混合這些剪輯,所有這些都可在Timeline中實現。



Cinemachine是累積了多年遊戲和電影鏡頭運鏡的經驗而成的結晶。現在,它更將業界領先的鏡頭系統交到所有人手上,引領程式化攝影的時代。

這是一套智慧攝影系統,可以動態根據場景的構成和互動,在最佳時間拍攝最佳鏡頭。使您擺脫無盡的手調動畫、鏡頭程式設計以及後製修改的過程。

現在Cinemachine可以在Asset Store中下載。

從第一人稱射擊遊戲到第三人稱動作冒險,您可以很容易的用Cinemachine改變遊戲內鏡頭:

  • 像電影導演那樣,使用鏡頭工具及真實的鏡頭設定,控制鏡頭序列。
  • 合成鏡頭,把重點放在美術方向上,而非實現細節。給Cinemachine智慧攝像機一個簡單的指示,比如跟隨人物的頭部,如果動畫發生變化,鏡頭會自動改變並繼續工作。


在Unity 2017.1中,我們為Cinemachine加了許多新功能,比如:
  • 多目標物件:以多個物件為目標,並設定它們的權重。它會基於任意數量的物件建立一個邏輯,根據成員的位置來定位自己該去的位置。在跟蹤一組物件時,可以將它用作LookAt和Follow方法的目標。對2D場景也非常適用。
  • 動態取景多個物件:這個功能基於物件的位置自動取景一組目標。如果物件散開,Cinemachine會根據你建立的一套規則調整FOV或Zoom(或兩者同時進行)
  • 全新開放API:輕鬆訂製Cinemachine配置,取得專案所需的鏡頭行為。
  • 鏡頭軌道:創造出像電影一樣的鏡頭軌道,讓鏡頭在遊戲世界裡平滑移動。適合於電影鏡頭或當你希望鏡頭沿著一組軌道跟蹤拍攝對象時。
  • 安全鏡頭:會根據鏡頭優先順序與品質,動態選擇最佳的鏡頭。例如有東西進了取景框破壞了畫面?沒問題,Cinemachine會判斷並切換到另一個攝影機。很適合重播或場景的電影鏡頭序列。
  • 狀態驅動鏡頭:允許攝影機和動畫狀態之間形成關聯。從動畫中觸發不同的鏡頭行為。

Timeline和Cinemachine能結合使用,可以將敘事流程帶入更高層次。然後使用後製處理特效進一步強化畫面,營造更好氛圍和戲劇效果的場景。



想瞭解Timeline和Cinemachine的用法,可以看今年Unite歐洲的演講(英文)。

Post-processing Stack的改進(Beta)

Post-processing將全螢幕濾鏡和特效應用於鏡頭的圖形緩衝區,然後再把它顯示在螢幕上。你可以使用後製特效來模擬物理鏡頭和各種電影效果。

你可以下載最新版的Post-processing Stack(Beta)。我們預計今年夏季發佈正式版(友善提示:如果你要上一個較穩定的版本可以在Asset Store下載)。

改進後的後製特效處理可以將一組完整的圖形效果整合到單個後製處理流程中,並帶有下列高品質的鏡頭效果:

  • Screen-space anti-aliasing 
  • Auto Exposure 
  • Motion Blur
  • Bokeh Depth of Field
  • Bloom
  • Color Grading 
  • Chromatic Aberration
  • Film Grain
  • Vignette
你可以把多個特效合成到單個Pass中,使用基於Asset的預設設定系統管理特效也非常輕鬆。

顏色分級(Color grading)特效是一種支援Academy Color Encoding System (ACES)的全HDR顏色流程,低階平台可以使用LDR管線。這個後製特效有兩個螢幕空間的光照特效,環境光遮蔽(AO)和螢幕空間反射(SSR)。

這個新版本裡還提供了一個基於體積混合的特性,你可以在場景中定義區域(任何類型的網格),並在玩家進入區域時設定特定的氛圍/外觀。Unity會自動在範圍內進行混合,實現流暢的畫面轉換。


Unity Collaborate多人協作已正式發佈!現為Unity Teams一員

Unity Collaborate多人協作已結束測試,與Cloud Build雲端打包一起成為Unity Teams的一員,一個解決方案一套功能,就可以幫助你更快速進行團隊協作。Unity Teams將可免費使用至2017年10月,可以看這裡了解更多(英文)。

對於Collaborate多人協作,我們在Unity 2017.1中發佈的首個版本並處理了Beta用戶提供的反饋。除了效能改進、穩定性之外,我們還增加了一組新功能:選擇性推送、更好的Asset瀏覽器整合和一個新的“In Progress”功能,用來標註團隊成員在某個場景或預製物件上有未發佈的本地更改。



以下是我們為Collaborate多人協作增加的一些新功能:

In Progress標註
為場景和預製物件加上了In Progress標註,告訴團隊中其他人已對某個場景或預製物件做出了一些未發佈的更改。這個功能有助於協調對場景和預製物件的更改。





按右鍵選擇性發佈
我們增加了按右鍵的操作,現在你可以在專案視窗中直接發佈、退版、查看差異,解決檔衝突等等。這是一個重要的開發者需求,我們希望讓Collaborate的操作和其他專案管理更加一致。原Collaborate用戶請注意,要更新這個功能之前必須確保舊的版本所有發佈已更新到最新。



專案視窗體驗更佳
在專案視窗的“Favorites”中加了新的篩檢方式,包括“All Modified”、“All Excluded”和“All Conflicts”,這樣開發者就可以看到他們所有正在修、已修改、有衝突和忽略的檔案。特別要留意的是“All in Progress”,可以讓你即時看到Collaborate團隊中的其他人正在處理哪些Asset。




即時分析操作(Live-Ops Analytics)
Unity 2017.1可以透過資料來驅動這個服務,隨時獲得豐富的分析資料。深入瞭解你的玩家在你的遊戲裡的情況,方便即時針對它們的喜好做出對應的調整,不需要重新打包發佈。在Unity 2017裡,可以更好的為玩家提供更佳的遊戲體驗。

通過Standard Events (目前是Beta版)可以進行更有效的檢視,它提供了一組預定義事件,可顯示和你遊戲相關的重要資訊。使用新的 Analytics Event Tracker,不需要寫程式即可實現這些功能。



使用Remote Settings 功能,可以即時更改遊戲設定,不需要重新打包發佈,這個功能已加到Unity Analytics分析服務中。




2D功能大躍進
在Unity 5.6中,我們在2D工具和工作流程做了重大改進。Unity 2017.1中導入了2D Sprite Atlas,這是一種新的Asset,將會取代Sprite Packer。隨著它的出現,新的工作流程可以在執行時更容易控制圖片的打包和使用。導入Atlas圖集是Unity中2D工作流程的重要組成部分,而Sprite Atlas不僅提供了更簡單的圖集建立和管理方式,還有對應的API可接,能獲得更多的控制。



Sprite Masks用在世界空間中隱藏或顯示圖片或圖片組的一部分。圖片遮罩只對擁有Sprite Renderer元件或粒子系統的物件有效。



在Unity 2017.1中,我們還為Sprite編輯器加了物理形狀編輯。可以為圖片設定自訂的預設形狀,以使用PolygonCollider2D產生碰撞器的形狀。



Animation的改進
我們對Animation視窗進行了全面修改,改進了keyframe的工作流程,使動畫製作更方便,支援與Animator狀態機互動。而Performance Recording是一個實驗中的功能。

新的keyframe工作流程支援明確指定何時將哪一格變為keyframe,並在預覽時將所有未修改未定義的keyframe都刪除。我們已經改變了在Animation視窗中編輯剪輯的預設行為(新的預設預覽模式)、視覺和全域keyframe操作熱鍵。這些改變的目的是在Animation視窗之外為keyframe操作提供一個更流暢的工作流程,同時預覽動畫不需要在autokey/rec模式下。

現在在編輯器中play狀態可以對狀態機行為進行除錯。

我們還導入了GameObjectRecorder,這是一個新的測試編輯器功能,它允許你錄製GameObject和它子物件上的任何屬性行為。並將記錄到的所有內容存到一個動畫片段中,
這樣就可以輕鬆建立動畫




Playables已正式發佈
Playables API透過使用樹狀結構的PlayableGraph組織和分析資料來源,提供一種建立工具、特效或其他遊戲機制的方法。PlayableGraph允許您混合和修改多個資料來源,合成為單一輸出後播放。

Playables API支援動畫、音訊和程式腳本。Playables API還提供了透過腳本來與動畫系統和音訊系統進行互動的能力。

Playable API是一個通用API,它最終也將用於影片和其他系統。查看文件瞭解更多細節。


Ambisonic音訊
在Unity 2017.1中,我們增加了對環繞身歷聲音訊剪輯的支援,這是全方位環繞音訊技術,除了水平面外,它還覆蓋了聽眾上方和下方的聲源。

Ambisonics以多聲道格式儲存。它不是將每個通道都映射到一個特定的喇叭,而是以一種更通用的方式來表示音場。然後根據聆聽者的方向(即VR中玩家的頭部角度),來旋轉音場。音場也可以被解碼成一種與喇叭設定配合的格式。Ambisonics通常與360度影片結合使用,也可以用作音效skybox,表現遙遠的環境聲音。

我們還加了Ambisonic解碼器套件,現在也可以在新的敘事工具Timeline中透過一個腳本來使用它。


編輯器改進
我們在UnityEditor.IMGUI.Controls中加了一個新的ArcHandle類別,它可以在場景視圖中互動式編輯弧線。也加入了SearchField的新IMGUI控制項目,它帶有普通和工具列使用者介面風格,但也可以自行定制。



現在還支持使用JetBrains Rider作為外部腳本編輯器。

其他改進還包括對所有player loop階段加上分析器標籤(Profiler labels),改進Package Export載入狀態,以及記錄已連接玩家的log資訊,這些都將出現在編輯器控制台中,使除錯更加輕鬆。

UI Profiler

Profiler視窗上現在把UI專門獨立一個區塊出來幫助您除錯UI。 現在可以清楚看到UI批次產生流程中發生了什麼事,方便你解決那些UI造成的效能問題。 有了這些資訊,您可以重新排列層次結構來避免那些隱藏的消耗。




改進了對Visual Studio的支援,包括Mac OS
現在安裝Unity時可以選擇在Windows上安裝Visual Studio Community 2017(而非Visual Studio Community 2015)。安裝速度較快也更省空間。

Mac用戶也別難過,現在可以在Mac上使用Visual Studio了!微軟發佈了Mac版的Visual Studio和Tools for Unity。Visual Studio for Mac還提供了許多很酷的功能:一鍵除錯
,IntelliSense for Unity messages,針對Shader程式高亮顯示等等。


場景與Asset Bundle改進
我們對遊戲中的場景和Asset Bundle進行了一些改進。更改底層架構使場景和Asset Bundle載入速度更快使玩家體驗更好。我們還建立了一個工具,Asset Bundle Browser。


Asset Bundle Browser
Asset Bundle Browser的正式版與Unity 2017.1一同發佈。它允許你在Unity中查看和編輯Asset Bundle的配置。它的目的是替換當前選擇Asset的工作流程,並在檢視視窗中手動設定Asset Bundle的工作流程。現在您可以查看所有的Asset Bundle配置。透過拖放能安排、修改和分析相關資源包。

這個工具會顯示可能需要注意的警告,提示將中斷資源包創建的錯誤。透過查看包內容,你可以更有效地組織Asset Bundle。也可以查看單個Asset Bundle,並處理包和包之間的Asset依賴關係。





腳本核心升級(測試)到 C# 6和.NET 4.6
在Unity 2017.1中,我們把腳本核心升級支援Mono/.NET 4.6。它包含了許多修復、效能改進,可以使用C# 6。我們相信它會提高遊戲的整體效能。

可以在Player Settings中啟用.NET 4.6:



注意,更改設定會在重啟編輯器後生效,因為它會影響編輯器和播放。對應的腳本API是PlayerSettings.scriptingRuntimeVersion屬性。

IL2CPP完全支援新的.NET 4.6 API,因此你仍可以用C#編寫程式但有C++的效能優勢。


Model Importer改進
現在從Unity導入Maya匯出的FBX檔已支持Segment Scale Compensation,而且FBX SDK已升級至2016.1.2。

在導入FBX檔時,我們還加了計算加權法
線(weighted normals)的選項,如按面積、角度或二者皆有,以及硬邊緣(Hard edges)的法線產生。現在也能從FBX檔中匯入燈光和鏡頭資料,Unity會自動在需要時為物件加入和安排鏡頭和燈光組件。

Unity現在可以使用“Import Visibility”屬性從FBX檔中讀取可見屬性。值和動畫曲線將啟用或禁用MeshRenderer組件:




Progressive Lightmapper改進
Unity 2017.1增加了Progressive Lightmapper中對烘焙LOD的支援。在烘焙LOD時,Enlighten和Progressive Lightmapper之間的主要區別在於使用Progressive Lightmapper不必在LOD周圍放置光照探針來獲得反射光。在完全烘焙解析度下,間接光照將為LOD提供更優質的烘焙光照貼圖,您也可以避開安排光照探針的繁瑣過程。(Unity 5.6中也有此功能。)

我們還在Progressive Lightmapper中加了對雙面材質的支持,通過加上新的材質設定,使光線與背面接觸。啟用後在進行全域光照計算時幾何體的兩面都被包括在內。當從其他物件觀察時,背面不會被認定為無效。背面渲染既不受該設定的控制,也不會在光照貼圖中顯示。背面使用與正面相同的自發光和漫反射設定反射光線。(該功能也可在Unity 5.6中使用)。




即時陰影改進
我們優化了在穩定模式下定向光源陰影投射器的選擇。這代表著產生陰影貼圖時的Draw Call更少。這個優化是與場景和設定相關的。例如在四個級聯光(Cascaded directional light)的情況下,可以看到Draw Call數量明顯下降不少。根據太陽/鏡頭的方向,有機會可以減少50%的陰影投射器數量。下面是Viking Village的一個例子:

這個場景在Unity 5.6中有5718個陰影投射器。


使用Unity 2017.1,相同的場景,只有4807個陰影投射器。



Unity 2017.1還實現了即時陰影的Percentage Closer Filtering (PCF)。每個圖元的深度值都是從當前圖元周圍的陰影貼圖中取樣,並所有的採樣值進行比較。這使得光和影之間的線條更加平滑。您可以在下圖中看到對比:




除了即時陰影改進,Shadowmask和Distance Shadowmask光照模式現在已成為Quality Setting中的參數,可以在執行時進行修改而不會有任何效能消耗。例如可以在室內使用Shadowmask (實現柔和的陰影),並在相同關卡中的戶外場景即時切換到distance Shadowmask。它也可以作為一個品質設定。

我們還加了Custom Render貼圖作為渲染貼圖的擴展,可以很方便的用著色器來更新貼圖。這有助於實現各種複雜的模擬,比如焦散光、雨滴漣漪模擬,牆面液體噴濺等等。它還提供了一個腳本和著色器框架,以便進行更複雜的設定,比如局部或多階段更新,不同的更新頻率等等。



有了新的LineUtility類別和LineRenderer.Simplify函式,現在可以優化線條,用LineUtility建立由簡單形狀組成的簡化版本。


使用Metal/OpenGL ES3實現iOS上的Deferred Rendering
我們為加入deferred rendering path支援
使用Metal和OpenGL ES 3.0像是A8晶片和以後的iOS設備。當開啟它時,影響GameObject的燈光數量就沒有限制。所有的燈光都是按圖元計算的,這代表著它們都能與法線貼圖進行正確的計算。此外所有的燈光都可以有投影和陰影功能。


粒子系統改進
我們加入了Sprite到粒子系統,粒子的碰撞力(可以推動碰撞器),大形模型的支援改進,包括一個新的形狀類型,噪點模組加了新選項,以及其他一些較小的特性和強化。因為增加了新的控制和約束,例如速度與對齊,使得在2D中使用粒子更加輕鬆。可以使用粒子來獲得比以往更多的特效和動畫效果,包括光線的線條和尾跡。

透過Texture Sheet Animation模組,我們在粒子系統中增加了對圖形的支援。這使粒子系統能更好進行圖集處理和批次處理,同時也在粒子系統中增加了大量與Sprite相關的特性,例如不同大小的動畫幀,以及每幀的軸心點。






噪點模組(Noise Module)提供了新的選項,可以更好將噪點應用於粒子效果中。這個功能在Unity 5.5中第一次出現,噪點被應用到粒子的位置屬性。在2017.1中我們可以將噪點應用到更多的地方:

  • 位置
  • 旋轉
  • 大小
  • 使用Custom Vertex Streams的著色器(非常適合製作UV失真效果!)


在粒子系統形狀模組的碰撞模式中,我們引入了一個新的甜甜圈粒子發射形狀和編輯模式。模組內的Transform可以為粒子發射的形狀應用自訂位置、旋轉和縮放。

其他的改進還包括將粒子與速度方向對齊的能力,以及允許在局部空間系統使用Emit over Distance。邊緣粒子發射現在更加靈活,可以選擇用來產生粒子的邊緣厚度。

粒子現在也可以使用碰撞模組對碰撞器進行施力。




Windows Store現在改名為Universal Windows Platform
Unity現在支援Windows商店的Universal Windows Platform(UWP)應用模式,支援為Xbox One、Windows 10、Windows Phone 10和HoloLens進行構建。

請注意,對Windows Mixed Reality PC設備的支援將在今年發佈。




我們增加了對UWP的多顯示支援,現在Unity player 二進位檔案已做數位簽章,增加了額外的一層安全性,可以防止對Unity運行時二進位檔案進行篡改。

最後,我們取消了對Windows 8.1和Windows Phone 8.1應用的支持,Unity 5.6是最後一個支持這兩個平台的版本。


Sony PS4支援Video Player
我們在Unity 5.6中加入了一個全新的Video Player,在Unity 2017.1中正式支援 Sony PS4,完成了對跨平台的支援。PS4的Video Player使用Sony的AvPlayer庫來加速h.264的解碼。解碼h.264(PS4的推薦格式)時,CPU消耗非常低。可以同時對最多8個h.264進行解碼。它還支援對webm容器中的VP8格式進行軟體解碼(會有更高的CPU消耗)。最後它支援多種影片渲染模式(直接渲染到攝影機的近/遠平面,作為材質覆蓋,或渲染貼圖),音訊流可以直接輸出或發送到Audio Source進行混合。


Low-Level Native Plugin渲染擴展
我們擴展了底層渲染API,並提供了一些很酷的新功能:

  • 現在可以將user data發送callback函式。
  • 我們擴展callback的可能事件列表增加。
  • 我們在Shader編譯器中加了hook功能,允許你在發送到編譯器之前對著色器進行更新。這可以設計透過自訂關鍵字來控制自訂變體(Variants)。
要想瞭解這些擴展功能的威力,可以查看NVIDIA的VRWorks裡面的資料,它是實現這一切的基礎。


VR: NVIDIA VRWorks
在Unity 2017.1中,NVIDIA VRWorks透過以下功能幫虛擬實境提供了一種全新高度的視覺擬真、效能和反饋力:

  • Multi-Res Shading是一種用於VR的創新性渲染技術,它可以使圖像的每一部分都能渲染在一個與鏡頭矯正圖像圖元密度相匹配的解析度上。
  • Lens Matched Shading使用NVIDIA基於Pascal的GPU的新Simultaneous Multi-Projection架構,為圖元著色提供潛在的效能改進。
  • Single Pass Stereo使用NVIDIA基於Pascal的GPU的新Simultaneous Multi-Projection架構,僅對模型進行一次繪製,即可在雙眼視圖同時投射相同物體。
  • VR SLI為虛擬實境應用程式提供更高的效能,可以指派獨立GPU給特定眼睛,大大加速立體渲染。
為了更好實現這些功能,建議在PC上使用GeForce 9系列或更高的GPU來執行。可以從Asset Store下載




Release notes
請查閱Release notes說明,瞭解新功能與bug修復的完整列表。

再次感謝那些在測試版本協助我們改進功能的開發者們。

2017年6月14日 星期三

Unity 5.6中的混合光照詳解

作者:Kemal Akay 原文
潤稿:Kelvin Lo

在Unity 5中,光照得到了很大的改進。現在要打造超逼真的遊戲已成為可能。Adam動畫短片只是證明這種可能性的一個例子。出於對效能的考量,許多Unity開發的遊戲仍然依賴烘焙光照(Baked lighting)。但有時候又必須使用即時和烘焙光照。這在以前會是個問題,在5.6中Unity已解決了這個開發者呼聲很高的需求。

光照功能對新手來說可能比較難懂,因為編輯器預設不會顯示光照設定的介面。而且我們的調查顯示,幾乎所有新手對於光照貼圖都沒有概念。因此,我們改了UI使它更顯眼,不過,有些概念性的知識還是必須要瞭解的。首先簡單介紹即時光照與烘焙光照(光照貼圖)之間的區別。之後再對混合光照進行講解。如果你已熟悉這些概念,可以直接跳過。



何謂預計算即時光照(Precomputed Realtime GI)和烘焙光照(Baked GI)

首先,Unity中新的光照模式沒有為預計算即時GI帶來任何新的內容,而是為開發者提供了可以在場景中同時使用即時與烘焙光照的新方法。即時光照很容易理解,對燈光的任何調整會即時更新場景中的所有光照,唯一的問題是會耗效能。每次調整燈光都會對效能產生很大的影響。因此,Unity同時引入光照貼圖的概念。可以烘焙光照,並將所有光照資料以光照貼圖的形式保存在專案中。這樣做代價很低,因為本質上它只是一個貼圖。

烘焙光照與即時光照的一個主要區別是:烘焙光照都是靜態的,你不能移動這些靜態物件,否則就會出現破綻。將遊戲物件設為靜態物件很簡單,只需要在檢視視窗中將它們標記為static(或只是lightmap static)。這樣Unity會為該物件烘焙光照貼圖。如果你希望物件保持動態,就不要打勾,它們預設就是動態的。



預計算GI – 日夜迴圈


有關這方面概念的詳細介紹已超出本文範圍,而且Unity官網上已有一個由David Llwelyn和光照團隊製作的
系列教學介紹了Unity中使用即時GI光照的優化技巧。

除此之外,我們最近還更新了AssetStore中的Courtyard範例,讓它和Unity 5.5相容。有興趣可以下載試試看,瞭解如何在專案中使用即時光照。


直接光照(Direct light)與間接光照(Indirect light)

許多新手容易忽略的另一個重要概念是,直接光照與間接光照之間的區別。與即時光照類似,直接光的概念也很容易理解。就是從一個光源發射的光射線直接影響一個物體,可以從畫面直接觀察到的。

相對難理解的是間接照明這個概念。基本上,間接照明透過反彈光來實現。除了直接光照,我們還能有反彈的光照。可見光子在一個場景中基於數學公式做簡單的反彈。間接照明的原理如下圖:




透過Light元件的“Bounce Intensity”參數,可以設定一個燈光的間接光貢獻度。換句話說,如果你希望關閉間接光照,可以把這個參數設為0。

所以,預計算即時GI很有趣,能在Unity中發揮的很完美。但是它的代價很高,針對比較低端的設備(例如手機),或是有特別需求的渲染(VR),就需要有更優化的場景設定。然後Unity就會選擇對所有靜態物件進行光照烘焙(例如環境),並對所有動態物件(例如角色)使用即時GI。所以就會產生接下來的問題。


混合光照(Mixed lighting)

從字面上來看混合光照已經說明一切,就是能混合使用即時和烘焙光照。我們所提到的狀況大多數是遊戲會用到的典型狀況。例如在《Last of Us》中,環境場景是固定的,因此它對應的所有東西都儲存在光照貼圖中,而所有移動物件則使用的是即時光照。

可以先烘焙所有環境,然後對角色設定即時光照。但這樣會引發一個嚴重問題:所有的已烘焙物件也會接收動態光源,造成這些物件雙重曝光。當然也可以對這些烘焙物件進行即時光源遮擋,但這樣很容易造成亮度不均。下圖就是這個問題的一個例子。相同材質的相同模型,但其中之一是動態的,另一個是靜態的:



或許這樣你還能勉強接受,但在有些情況下可能就完全走鐘。
此時就該換混合模式登場了。基本上混合模式會幫你處理好一切,平衡範圍內的動/靜態物件亮度(保留視覺逼真度與一致性)。在Unity 5.5中,你可以在檢視面板中將Light Type設為Mixed來啟用混合光照。

那麼現在可以安心的對動態和靜態物件使用混合光照了吧? 
等等……為什麼在這種模式下聚光燈(Spot light)或點光源(Point light),無法投射動態物件的陰影?

原來期望聚光燈能同時影響動態與靜態的物體。到底是我哪裡改錯了還是這是一個Bug?很多開發者會問為何混合聚光燈不會投射任何陰影?

其實原因是混合光照只能
"只有"一個定向光(Directional light)時才能正常工作。

蝦米!你過來我保證不打死你!


Subtractive模式

這就是在Unity中導入新光照模式的主要原因,基本上就是為了解決這個問題。5.6在光照介面中你有四種光照模式可以選擇。它們是Baked Indirect, Distance Shadowmask, Shadowmask以及Subtractive。只有三項新的光照模式加入。其中Subtractive算是舊的混合模式,與其他模式相比它的效能消耗要小,這在開發像是手機專案時仍有點用處。

讓我們用Unity的技術術語來重新描述下這個模式的工作原理:選擇‘Mixed’烘焙模式,標記為靜態的物件會把來自混合燈光的資訊保存為光照貼圖。但與標記為‘Baked’的燈光不同,混合燈光還會為場景中的動態物件提供即時光照。前面提到只有單個定向光時它才能正常工作對吧?沒錯,因為混合點光源和聚光燈不會在物件上投射任何陰影。

此外,Subtractive模式裡還有一個特別的功能。它與其他模式不同,直接光照也是烘焙的,因此在Subtractive光照模式中,沒法有鏡面反射。


探針遮蔽(Probe Occlusion)

在Subtractive模式中,另一個動態物件需要使用的重要元件是光照探針組(Light probe groups)。沒有光照探針,動態物件就無法對用在靜態物件的光照進行採樣,更重要的是它們無法使用遮擋資料。因此為了能接收陰影,動態物件需要將來自光照探針的光照進行混合。在下面的圖像中,你能看到一個動態物件是如何利用光照探針做遮蔽的。


為了實現更精確的遮擋,可以為場景中重要的物件(例如主要角色)指定光照探針代理(LPPV)。但是要注意這會帶來額外的效能消耗。

色彩空間與Subtractive模式中的渲染路徑

關於Subtractive模式還有一點需要提一下。這個模式是為Forward 渲染模式和Gamma顏色空間設計的。不適用於Deferred 渲染模式和Linear顏色空間。因為Subtractive模式與其他模式相比,效能消耗相對要小,主要用於像手機這樣的低階設備。有關渲染路徑(Rendering paths)和色彩空間(Color space)的資訊可以在官方手冊中查看。


新的光照模式Distance Shadowmask, Shadowmask 和Baked Indirect

Unity對Shadowmask的支援是新混合光照模式中的一個重要新功能。此外,還有密度與方向性貼圖,Unity現在能為所有的光照類型生成Shadowmask了。與Subtractive模式不同,Shadowmask可以將所有光照類型的即時與烘焙陰影無縫混合。這表示我們可以獲得遠距離陰影。出於效能考量,可以在近處使用即時陰影而遠處使用烘焙陰影,來保持更低的Draw Call。與Subtractive模式相反,Shadowmask功能還可以產生高品質的即時鏡面高光。除了這些功能外,我們還對UI做了改進與重建,加了新的除錯模式來協助你更好的在場景中設定光照。

這個影片顯示了用Shadowmask 和Distance Shadowmask的效果。預計算即時GI在這個場景設定中已完全關閉。


我們已經說過Subtractive模式就是Unity中舊的Mixed模式。除此之外,Lighting Mode介面中還有兩個新的選項: Baked Indirect 和Shadowmask。要重點注意的是,Baked Indirect和Shadowmask不是品質設定。所有模式都有自己獨特的功能特性,它們能在不同的場合中發揮不同的作用。

Shadowmask的主要功能本質上非常容易理解,它可以解決Subtractive無法完成的事情。Shadowmask不僅能處理方向光,還可以使用點光源和聚光燈混合即時與烘焙陰影而不會增加雙重陰影/光照,意思就是可以正確合成重疊的陰影。


在繼續之前,我們需要先定義陰影距離的概念,它與光照模式息息相關,但許多新手不知道這個概念。要正確有效的製作場景,就必須要掌握這個觀念。否則很容易就會碰到不必要的draw call和FPS下降。


陰影距離(Shadow Distance)和陰影投射物(Shadow Casters)的概念

在Unity中,陰影的行為由陰影距離和光照模式決定。查看陰影距離的一種快速方式就是使用Shadow Cascades模式。在場景視圖中可以選擇Shadow Cascades模式來顯示陰影距離。這個參數可以在Quality設定中修改。你也可以用程式呼叫API來更改陰影距離,只不過使用場合相當有限。不過它在某些極端情況下會有作用(例如當需要在某些光照模式中為了降低draw call而減少陰影距離)。


因此,物件在陰影距離之內還是之外,會影響陰影的行為,並對效能產生直接影響。

實際上,如果打開Quality設定(Edit > Project Settings > Quality),會發現有很多參數可用來調整陰影的設定。很可惜這些設定被藏在這裡,大部分開發者都不知道它們的存在,除非在需要時搜索到這些參數。

尤其是可以在Distance Shadowmask和Shadowmask之間切換的Shadowmask功能選項。預設的是Distance Shadowmask選項,接下來會討論這兩個模式之間的區別。讓我們先從Shadowmask開始。

Shadowmask

在Shadowmask模式中,靜態物件透過Shadowmask從其他靜態物件接收陰影,不必考慮陰影距離。來自動態物件的陰影只能透過陰影距離內的陰影貼圖獲得。動態物件透過陰影距離內的陰影貼圖接受來自其他動態物件的陰影。來自靜態物件的陰影僅能通過光照探針獲得。

現在,當你同時在動態物件和光照貼圖靜態物件上使用Shadowmask模式時,首先你可能會發現問題就是,動態物件的陰影(Shadow maps)和來自光照貼圖靜態物件的烘焙陰影不一致。Unity 5.6在執行時只支持簡單版本的PCF( Percentage Closer Filtering )陰影,這種陰影很簡陋,走近時還可能會出現陰影瑕疵。因此,動態物件是不可能獲得軟陰影(Soft Shadow)的。與之相比,靜態物件則相對較容易獲得軟陰影。實際上,通常需要增加解析度以渲染更多靜態物件的陰影,因為你需要更多的貼圖圖元來定義一張光照貼圖上的陰影。只有這樣,你才能渲染出與來自動態物件的陰影貼圖相近的陰影。


你可以看到,使用高解析度光照貼圖,來自靜態物件的烘焙陰影與來自動態物件的陰影貼圖已十分接近。


使用低解析度的光照貼圖,來自靜態物件的烘焙陰影與來自動態物件的陰影貼圖明顯不同。

關於Shadowmask模式的一個友善提示:動態物件只會在陰影距離內投射陰影貼圖。而靜態物件,無論陰影距離是多少,只會投射烘焙陰影。Shadowmask 和Distance Shadowmask兩者均可提供即時鏡面高光。

那麼問題來了,什麼是Distance Shadowmask?它與Shadowmask有何不同?



Distance Shadowmask

普通的Shadowmask模式要比Distance Shadowmask模式產生更少的Draw Call。為什麼呢?

這是因為Distance Shadowmask的行為是由陰影距離決定的。在陰影距離內,動、靜態物件都會渲染進陰影貼圖,靜態物件可以在動態物件上投射銳陰影。超出陰影距離,靜態物件會通過預計算Shadowmask接收來自其他靜態物件的高品質陰影,而動態物件則通過光照探針與LPPV,接收來自靜態物件的低解析度陰影。

這樣應該能解釋清楚Distance Shadowmask模式下動、靜態物件的陰影投射方式以及為何Shadowmask模式要比Distance Shadowmask模式資源消耗更少了。基本上,陰影貼圖的效能消耗要高於烘焙陰影(因為它們在每幀都進行渲染,而烘焙陰影是保存在一個貼圖/光照貼圖中的)。

在Shadowmask模式下,動態物件只會在陰影距離內投射陰影貼圖。Distance Shadowmask的效能消耗更大,因為靜態物件也可以在陰影距離內投射即時陰影貼圖,這樣會使Draw Call增加。這也就是為什麼Distance Shadowmask模式更適合高階PC或遊戲主機的專案。而Shadowmask則作為一種廉價的解決方案,在中低階設備使用。

Shadowmask中的遮蔽

有關Shadowmask的功能,我還想就不同物件類型遮蔽的工作原理進行詳細說明。本文我們談到了為何光照探針的放置位置對於動態物件接收來自靜態物件的陰影如此重要。本質上,動態物件需要光照探針從遮蔽物採樣遮蔽資料。因此,Subtractive模式中的探針遮蔽概念同樣可以直接適用於Shadowmask和Distance Shadowmask。

有關物件是如何根據類型與光照模式接收對應陰影的快速參考可以查看光照模式參考卡(Lighting Modes Reference Card),也可以列印出來以備不時之需。



作為Quality設定的Shadowmask

在Unity 2017.1中,Shadowmask和Distance Shadowmask選項被移到了Quality設定中,這麼做的原因有兩點。

首先,我們希望開發者能對陰影行為能有更多創意的控制,所以可以在執行時對模式進行切換。例如,你可以在同一場景中的室內環境使用Shadowmask(比如在機庫中實現軟陰影),在室外環境時切換到Distance Shadowmask。事實上,我有另外一篇文章來說明如何用API來實現。

其次,可以針對不同的硬體設定不同的要求。例如在遊戲中的設定頁面,可以顯示一個玩家可以調整的設定選項,如果你要發佈遊戲到Steam,可以在低階硬體上使用普通的Shadowmask,在高階PC上使用Distance Shadowmask。

之所以能這樣隨心所欲進行設定,是因為技術上在Shadowmask 和Distance Shadowmask之間的切換非常簡單,唯一的缺點就是Draw Call的數量,但不管怎麼說,最後都是取決於開發者。


技術限制和調試工具

最後,讓我們聊聊Shadowmask功能(Shadowmask 和Distance Shadowmask)的技術限制,以及能幫你在設定過程中進行問題診斷的除錯工具。

你已知道如何和為何使用Shadowmask,讓我們來聊聊它的限制。由於技術約束,在一個場景中,Unity僅支援4個重疊的混合燈光。如果在相同位置有超過4個的混合燈光,其中之一就會降級為烘焙。通常如果你看到其中有某個燈光突然爆亮,大概就是因為這個。

還好我們有個視覺化除錯工具可以幫你解決問題。如果將場景的visualization模式從“Shaded”切換到“Light Overlap”,你可以看到問題區域顯示為亮紅色。

值得一提的是,與點光源或聚光燈不同的是,方向光沒有定義的邊界,它是全方向的。因此,你在除錯重疊的混合燈光時,總要將它考慮在內。在螢幕上,你可能只看到4個重疊燈光,但實際上,方向光可能已在某些位置與之有了交疊。如果在場景中使用了多個方向光來進行照明(例如補光),那情況就有點麻煩了,所以小心使用它。



Baked Indirect

目前為止我們已經介紹了Subtractive模式、Distance Shadowmask和Shadowmask功能。還剩最後一個模式,Baked Indirect。

與Shadowmask複雜的選項相比,Baked Indirect模式相當容易理解。Baked Indirect沒有使用任何Shadowmask。所以在這個模式中沒有遠距離陰影。在陰影距離之內,所有靜態和動態的物件都投射 即時陰影貼圖。但超出陰影距離後,就沒有陰影。

在Baked Indirect中,除了間接照明之外所有的東西都是即時的。這代表即時光照、即時陰影以及即時鏡面高光,但是反射的光照資訊儲存在光照貼圖中是靜態的。在這個模式中,你能做的事情有限,但是你可以用它來做些很有創意的事情。下面你會看到搖擺的Baked Indirect模式混合聚光燈,是如何偽造即時全域照明的。


你可以看到燈光在變化,亮度忽明忽暗。但如果你仔細觀察街燈的間接照明,你會發現它並沒有變化。所以從技術上來說,你可以移動你的燈光,但不能太多,否則會出現陰影瑕疵。在下面的影片中,你會看到在場景中移動物件時,間接照明是如何導致這種類型陰影瑕疵的:



關於Unity 5.6中的混合光照就介紹到這裡,我們會不斷的為大家繼續翻譯分享從Unity官方部落格的技術文章!

2017年6月7日 星期三

iOS和macOs上的XR

作者:Scott Flynn, 原文

Unity的三大宗旨之一就是讓開發普及化,我們也關心著VR/AR行業相關的最新消息,期望全球開發者們將創意變為現實。

在6月6日的WWDC上,Apple首次公開展示了iOS對AR以及macOS對VR的支援。開發者將可以用整合ARKit的Unity直接為iOS設備開發AR應用,並且可以為macOS平台建立360全景影片以及VR內容。我們也非常興奮能與Apple合作來共同擴展VR/AR生態,確保XR(VR、AR、MR統稱為XR)行業能讓全球社群隨手可得。

現在Unity也推出了可用於在macOS平台上製作VR內容的體驗版,並在BitBucket上放了開源的Unity ARKit套件。

Unity滿足大家對於VR及AR內容開發的期望,能夠支援在Mac版的Unity編輯器中直接測試XR應用並快速反覆運算。使用這個VR體驗版已經可以製作內容並發佈至App Store。我們也找了一些開發者一起來測試這個版本,以下是他們的反饋:

“除了將專案升級為最新的Unity體驗版之外,幾乎毫不費力就可以將PC端的VR遊戲完美移植到macOS平台”
-- Zack Brown, Zulubo Productions


“整體來說,使用Unity將《Space Pirate Trainer》移植到macOS平台的過程非常流暢。我們讓它在macOS系統上跑了好幾個小時。之前我對Metal支持還有些猶疑,但Unity與Apple讓整個流程相當簡潔。過去幾個月裡Unity對Metal的支持進行了大量優化,並且支援很多自訂著色器,儘管在建立這些著色器時並非從Metal的角度出發。Unity、Valve及Apple都做得非常出色!”

– Dirk Van Welden, I-Illusions


macOS平臺Unity編輯器VR模式運行Space Pirate Trainer


在這個Unity體驗版中,我們與Apple及Valve共同合作對Metal 2進行了優化,以符合目前的VR渲染通道、Multi-Pass以及Single-Pass和Variants。在最初的版本中,我們利用WWDC上公佈的Metal 2新功能結合Instancing獲得了顯著的效能提升,而需要的Draw Call數量更是直接減半。


使用Unity為macOS開發VR應用

我們希望所有想在macOS平台上開發VR內容的開發者都來試用這個體驗版並給我一些反饋,協助我們改善產品品質。和所有Unity體驗版一樣,在進行升級之前請務必備份您的專案!


硬體及軟體需求:

  • 從論壇下載Unity XR體驗版,這個版本會包含開啟VR模式的選項,並加了OpenVR平臺。
  • 您將需要支援macOS的SteamVR套件。可以到Valve官網瞭解更多詳情
  • 為macOS開發VR內容需要系統版本為macOS High Sierra。該版本包含大量驅動與Metal優化,能最大化發揮硬體的潛能。
  • 與所有VR內容一樣,硬體品質會決定最終內容的品質。對於3D的VR內容開發建議使用Radeon Pro 500系列顯卡。



使用ARKit

我們在BitBucket提供了Unity ARKit套件,可以從論壇找下載。這個Unity套件將讓開發者們輕鬆使用ARKit的功能,例如世界追蹤(World Tracking)、即時影片渲染(Live Video Rendering)、平面預測與更新(Plane Estimation and Updates)、碰撞檢測API(Hit-testing API)、環境光預測(Ambient Light Estimation)以及原點雲資料(Raw Point Cloud Data)。


Unity中可以直接透過C#腳本API存取所有ARKit公開的功能介面。同時還提供了Unity腳本以便於為現有Unity遊戲專案整合這些新功能。請查閱BitBucket中Unity-ARKit-Plugin專案說明文件瞭解更多資訊。

硬體及軟體需求如下:

  • 使用Unity ARKit套件需要Unity 5.6.1p1及以上版本。同時也支援上述的體驗版。
  • iOS 11及以上版本
  • XCode 9 beta及以上版本,並且需要包含ARKit框架的iOS SDK
  • ARKit框架能夠支援的iOS設備

2017年5月25日 星期四

如何在Unity中實現Raymarching圖形效果


潤稿:Gallant Chu - 密卡登遊戲

本文由David Arppe分享一些在遊戲中使用Raymarching技術的建議,也會介紹用在遊戲中的Raymarching程式碼,看看Raymarching這種舊的渲染技術如何用新的平行處理和計算技術進行優化!

Raymarching技術實際上已經“歷史悠久”,在很早之前就被用於一些“古老”而經典的遊戲中。例如下面兩款經典的“老”遊戲:

1.《Tennis for Two》


《Tennis for Two》被廣泛認為是最早的遊戲之一,它是一款使用示波器進行遊玩的遊戲!非常酷並且很有創意!由William Higinbotham在1958年推出。

2. 《Donkey Kong》


《Donkey Kong》是一款誕生於遊戲黃金年代的家機遊戲。遊戲主角是Jumperman(也就是現在的瑪利歐)。它被認為是首批帶有故事情節的遊戲之一,玩家在螢幕上可以像“看電影”一樣,驚恐地看著公主一次又一次被綁架。由Nintendo Research and Development 1在1981年推出。

這些老遊戲都非常有創意,他們突破了當時電腦硬體和軟體的限制使用了現在仍未過時的技術。

什麼是Raymarching技術


Raymarching是一種電腦圖形渲染方式,但它的潛力仍未被完全發掘。Raymarching一般用於渲染體積貼圖、高度圖以及解析曲面。如今,大多數遊戲用OpenGL或Direct3D(DirectX)來使用顯卡的硬體加速器繪製多邊形,電腦可以以每秒60幀的速度渲染幾百萬個三角面。雖然Raymarching沒有那些圖形API那麼出名,但它可以僅用兩個三角面實現無與倫比的細節。

RayMarching是一種數學渲染方式。它是由距離場(點到一個圖元的距離)、固定步長(通常用於體積渲染)和根定位(一個數學方法)完成的。

這個Demo可以按播放喔!


建立上圖這樣的場景需要借助建模工具(Maya, Blender, 3DsMax),繪圖工具(Photoshop, Gimp, MSPaint)。而該場景使用數學方法建立,透過Raymarching技術來渲染,不再受渲染三角面數的限制。不過,Raymarching技術並不是萬能的,它速度較慢,我認為它應該與多邊形渲染一起使用。

上圖並非是"影片",而是真的透過程式渲染出來的畫面,你可以點左上方的Snail來看到完整的程式碼。

如何在遊戲中加入Raymarching

結合Raymarching與多邊形兩種渲染方式並不難。不過首先要理解它們之間的區別:
  • Raymarching並非百分之百精確。而使用距離場可以趨近於希望渲染的表面,但幾乎無法得到真正想要的距離。
  • 渲染多邊形(透視模式下)使用了投影矩陣。這是深度,不是距離。
通常兩者結合使用時,最簡單的方式就是從多邊形開始,用Raymarching作為結束。使用距離緩衝區進行深度測試是很難的,並且會局限於實體物體。Raymarching階段需要在所有渲染結束後進行(就好比實體物體無法在透明物體之前渲染)。您可透過原文中的具體程式碼,瞭解如何準備好深度緩衝區,並將它轉化為距離緩衝區!

這是一個在Unity裡寫的相機深度緩衝


float GetDistanceFromDepth(float2 uv, out float3 rayDir)
{
    // Bring UV coordinates to correct space, for matrix math below
    float2 p = uv * 2.0f - 1.0f; // from -1 to 1

    // Figure out the factor, to convert depth into distance.
    // This is the distance, from the cameras origin to the corresponding UV
    // coordinate on the near plane. 
    float3 rd = mul(_invProjectionMat, float4(p, -1.0, 1.0)).xyz;

    // Let's create some variables here. _ProjectionParams y and z are Near and Far plane distances.
    float a = _ProjectionParams.z / (_ProjectionParams.z - _ProjectionParams.y);
    float b = _ProjectionParams.z * _ProjectionParams.y / (_ProjectionParams.y - _ProjectionParams.z);
    float z_buffer_value =  tex2D(_CameraDepthTexture, uv).r;

    // Z buffer valeus are distributed as follows:
    // z_buffer_value =  a + b / z 
    // So, below is the inverse, to calculate the linearEyeDepth. 
    float d = b / (z_buffer_value-a);

    // This function also returns the ray direction, used later (very important)
    rayDir = normalize(rd);

    return d;
}
當我使用投影矩陣的相反數來確定UV坐標(變換為[-1,-1]→[1,1])位於近平面(x,y,-1)。 在這一點上,我沒有使用視圖矩陣,所以假設相機是原點([0,0,0])。 該坐標的長度將隨著各種UV坐標而不同。 使用UV坐標[0.5,0.5],它應該與近平面距離相同。
得到這些數字後,我設定了規範化的rayDir變數。 這個很重要。因為 Raymarching得透過Raycasting運作。


Raymarching的工作原理

在準備工作就緒後,獲得深度緩衝區裡的距離,就可以處理相交。透過逆投影矩陣計算出正確的射線,來匹配遊戲中攝影機的視角。然後定位攝影機即可。


fixed4 frag(v2f i) : SV_Target
{
    float3 rayDirection;
    // Our code from above!
    float dist = GetDistanceFromDepth(i.uv.xy, rayDirection);

    // The cameras position (worldspace)
    float3 rayOrigin = _cameraPos;
    // Accounting for the cameras rotation
    rayDirection = mul(_cameraMat, float4(rayDirection, 0.0)).xyz;

    //...
    // more to come!

}


紫色的部分是特別標出的,我將距離存入浮點數,透過一個float3作為一個out變數,所以它會輸出一個正確的FOV,但也丟失了相機的旋轉資訊。我們可以使用一個標準的統一變數(_cameraPos)獲得這個位置。 將rayDirection與視圖矩陣相乘,用0.0作為w參數的原因是因為我們不希望存此變數中的攝像機位置,因為我們只會旋轉它。
在Unity中的效果如下圖,兩個黃色球體與一個長方體相交。其中一個(右邊的)球體使用多邊形渲染。它按照預期與立方體相交。左邊的球體則按設置從遊戲攝影機中計算的正確FOV,位置和旋轉資訊。

另外請注意,與右側多面球體相比,用Raymarching渲染球體相交的立方體表面邊緣非常平滑。


渲染其他內容

使用Raymarching渲染需要較深的數學底子,或者用一些作弊的方法,就算是網路也沒太多資料可以找,這篇文章可以參考一下。http://iquilezles.org/www/articles/distfunctions/distfunctions.htm
Inigo Quilez - 一個真正的 raymarching 傳奇)

下面用球體以外的形狀來實現一些特殊物體!

float sdTorus( float3 p, float2 t )
{
  float2 q = float2(length(p.xz)-t.x,p.y);
  return length(q)-t.y;
}

這是一個環面的距離公式。此距離函數回傳從點到距離圖元最近的點的距離,將用於渲染甜甜圈。在下圖中可以看到黑色圖形、紅圈、藍點及紅線。左下角的藍點是攝影機,右上角的藍點是正在觀察的點。除了知道與最近平面(底部中心粗短的黑線)的距離以外沒有任何資訊。因此,使用這個距離來向前移動。不斷重複這個過程,直到到達最終想要的平面!最後就可以得到目標平面的距離。



要實現甜甜圈,還需要實現以下功能:

  1. 獲取射線源(攝影機位置)
  2. 獲取射線方向(攝影機FOV,長寬比還有旋轉角度)
  3. 在函數中添加一個距離函數(環形)
  4. 將光線投射到圖形上
  5. 在該光線上獲取到圖形表面的距離

下面,首先要計算一個點。使用標準的point-along-a-vector方程式,沿著所投射的射線移動一定的距離,然後計算到圖元的距離。將剛剛計算的數值加上沿射線移動的距離,然後重複該過程。透過FOR迴圈進行控制。


// Let's store the distance we're going to be calculating here
float d = 0.0f;
// We will step along the ray, 64 times. This value can be changed.
for (int i = 0; i < 64; i++)
{
    // Here's where we calculate a position along our ray. with the very
    // first iteration, it will be the same as just rayOrigin.

    float3 pos = rayOrigin + rayDirection * d;

    // This is the distance from our point, to the nearestPoint on the torus
    float torusDistance = sdTorus(pos, float2(0.5, 0.25));

    d += torusDistance;
}

//...
// more to come!



結果出來了,現在還只渲染出純黃色。到此已成功建立了一個環形,您也可以嘗試一些其它的距離函數,並觀察它們的工作工作原理。後面還會使用一些更高級的東西。


獲取G-Buffer資訊

還需要更多資訊來使用光照模型。現在,只有一條射線的距離。要在圖形上進行更多操作。
需要知道:

  • 3D座標
  • 表面法線

還好這些屬性都非常容易獲得!


// This is pretty self explanatory. We have the distance. We just need to move that
// far down the ray to get the WorldSpace position

float3 pos = rayOrigin + rayDirection * d;

// What were doing here is, offsetting the position on the X axis, Y axis, and Z axis,
// and normalizing it to get an estimate of the surface normals
// Declaring eps as a float3, allows us to do some swizzle magic

float3 eps = float3( 0.0005, 0.0, 0.0 );


// This is ugly, but you can wrap it in a function. All distance functions create
// a distance field, which is usually in a function called 'map'

#define TORUS(p) sdTorus(p, float2(0.5, 0.25)).x
float3 nor = float3(
    TORUS(pos+eps.xyy) - TORUS(pos-eps.xyy) ,
    TORUS(pos+eps.yxy) - TORUS(pos-eps.yxy) ,
    TORUS(pos+eps.yyx) - TORUS(pos-eps.yyx) );
#undef TORUS

nor = normalize(nor);

// The reason this works, is because we're normalizing the result. If the surface is
// up, the difference between the +Y and -Y sample will be larger than the differences
// between +X/-X and +Y/-Y. It all adds up to a really good estimate. For being very
// math-based, you're starting to see that raymarching is mostly estimates?
//...
// more to come

結果得到一個有法線和世界座標的圓環,讓我們繼續做下去。



為了照亮它,我用了標準的Phong光照模型來幫圓環打光。


// Let's create some variables to work with
float3 l = normalize(sundir);   
float3 e = normalize(rayOrigin); // with raymarching, eyePos is the rayOrigin
float3 r = normalize(-reflect(l,nor));
 
// The ambient term
float3 ambient = 0.3;    

// The diffuse term
float3 diffuse = max(dot(nor,l), 0.0);
diffuse = clamp(diffuse, 0.0, 1.0);     
   
// I have some hardcoded values here, 
float3 specular = 0.04 * pow(max(dot(r,e),0.0),0.2);
specular = clamp(specular, 0.0, 1.0); 
// Now, for the finished torus
float4 torusCol = float4(ambient + diffuse + specular, 1.0);

//...
// more to come!


看起來效果不錯,還缺少材質,可惜的是,也沒有辦法取得UV資訊,這部分我後面會解釋。





中場休息

在繼續說明之前,我想分享Shadertoy的另一個很酷的展示。 這也是一個可以互動的場景。 它具有折射,原始圖像和一些其他很酷的東西能和raymarching搭配使用。 陰影的半影效果基本上沒有任何消耗。 形狀的組合很容易實現(加,減,差)。 變形空間(扭曲,變形,彎曲)和實例也很簡單。


這個Demo可以按播放喔!

投影映射


接下來幫甜甜圈上撒些東西!可以在這裡這裡下載所用的貼圖。目標是盡可能地讓它看起來更像甜甜圈。


fixed4 frag(v2f i) : SV_Target
{
    // ..
    // All of the code we wrote is up here
    // .. 


    // Sample the dough, from 2 planes. We're using the z and x normals
    // to assure that we don't get any additive colors we don't want

    doughnutColor = tex2D(_Dough, pos.xy - float2(0.5, 0.5)).rgb * abs(nor.z);
    doughnutColor += tex2D(_Dough, pos.zy - float2(0.5, 0.5)).rgb * abs(nor.x);

    // Using a top-down plane, sample from the sprinkles
    // This should be a hard cutoff. So I will use an if statement
    // Also, I am going to use some noise to get the 'drizzle' effect.

    float noiseOffset = tex2D(_Noise, pos.xz * 0.2).x * 0.5f;
    if (nor.y + noiseOffset > 0.7)
    {
        doughnutColor = tex2D(_Sprinkles, pos.xz).rgb;
    } else {
        doughnutColor += float3(1.0, 0.75, 0.5); // a color should work here
    }

    torusCol.rgb *= doughnutColor;

    // AND FINALLY, remember how we calculated distance from the depth buffer?
    // You can use your favorite depth-test mode right here. 


    return (dist < d ? tex2D(_MainTex, uv) : torusCol);
}


最終結果就會像這樣


參考資料:


Tennis for Two - https://commons.wikimedia.org/wiki/File:Tennis_For_Two_on_a_DuMont_Lab_Oscilloscope_Type_304-A.jpg
Donkey Kong - https://en.wikipedia.org/wiki/Donkey_Kong_(video_game)#/media/File:Donkey_Kong_Gameplay.png
Distance Based Raymarching - 
http://hugi.scene.org/online/hugi37/sphere_tracing.jpg


2017年5月8日 星期一

Unity教學 - 低模場景打光與後製技巧

原文

@註:原文裡面有很多圖,由於沒有授權就不方便直接轉過來,因此除了影片外,我們只用中文描述整個過程。你可以另外開一頁原文來對照那些圖。

如何為低模場景打光



之前的Unity預計算即時GI系列受到了不錯的迴響。今天我們轉一篇開發者寫的Unity 5.5低模場景打光和後製技巧。



課前介紹


你可以瞭解到如下內容:


  • Unity中光照的基礎概念
  • 為場景設定預計算即時全域光照(Precomputed Realtime GI) 
  • 為動態(非靜態)物件增加光照探針(Light Probes)以使用預計算即時全域光照
  • 更改光照設定/顏色
  • 從Unity標準資源包中導入Images Effects
  • 設定攝像機的後處理圖像效果:
  • 環境光遮蔽(Ambient Occlusion)
  • 全域霧(Global Fog)
  • 景深(Depth of Field)
  • 色調映射(Tonemapping)
  • 抗鋸齒(Antialiasing)
  • 泛光(Bloom)
  • 色彩矯正定址貼圖(Color Correction Lookup Texture)
  • 暈影和色差(Vignette and Chromatic Aberration)
  • 調整場景顏色襯托不同的氛圍


教學使用的軟體:Unity 5.5和Photoshop CC 2017


1.確保將目標平台設為PC,Mac & Linux Standalone。
功能表File -> Build Settings,選擇“PC,Mac & Linux Standalone“,然後點Switch Platform按鈕切換平台。

2.啟用預計算即時GI(全域光照)
點Unity功能表Window -> Lighting打開Lighting介面,在Lighting介面選擇Scene頁籤。
打開Precomputed Realtime GI頁籤,設定即時解析度(Realtime Resolution)為0.5(解析度越小,全域光照預計算越快)
這裡建議在開發時可以將Realtime Resolution設得更低,在最後才設回0.5或更大。並將CPU Usage設為Medium。

關閉Baked GI

在介面底部取消打勾Auto,停止自動運算。

3.清除GI緩存

這樣做是因為場景可能未按預期進行烘焙。點功能表Edit -> Preferences,在GI Cache下點Clean Cache按鈕清除暫存。

4.使用預計算即時GI

在Hierarchy視圖選地表資源,並將它們設為靜態物件,以便使用預計算即時GI。對於非靜態資源可以使用光照探頭(Light Probes),後面會說明。

現在打開Lighting介面,啟用Auto Build。並等它算完(右下角會顯示藍色進度條)。代表地形正在預計算即時全域光照(Precomputed Realtime GI)或反射光照(Bounced Lighting)。

啟用Auto Build後,當場景發生改變時,例如移動地形,場景會自動重算即時全域光照。

5.確保將顏色空間(Color Space)設為線性(Linear)

點功能表Edit > Project Settings > Player,將Other Settings下的Color Space設為Linear。這裡設為Linear效果會比Gamma更佳。

6.更改光照設定

選取場景中的定向光(Directional Light),將它拖到Lighting介面Scene頁籤裡的Sun欄位,作為一個太陽光。
當使用一個程式化的天空盒時(Procedural Skybox),你可以指定一個方向光來表示“太陽”的方向(或是照亮場景的大型遠距離光源)。如果沒設定該值,則場景中最亮的方向光將被指定為太陽光。

另外,將Ambient Source改為 Color,並設定顏色為您喜歡的顏色(本例使用#896262)。它用於改變場景中的環境光顏色。

在Hierarchy視窗中選擇剛剛的太陽,將它依照X和Y軸旋轉來改變場景時間和氛圍。
調整光線和陰影直到效果滿意。

7.增加光照探頭

非靜態(移動的)物件使用光照探頭(Light Probes)來獲取反射光(預計算即時GI)資料。場景中所有的樹、石頭、蘑菇上都使用了光照探頭,即使它們靜止不動。最好為小物件使用光照探頭以提高效能,包括記憶體耗用和全域光照構建時間。

在Hierarchy視窗依次點Create > Light > Light Probe Group。

選Light Probe Group並將它移到場景資源(樹、石頭、等等)所在的地方。並將光照探頭放在地面,以確保所有物體都將受到預計算即時全域光照的影響。

選Light Probe Group,啟用Edit Light Probes模式。

在檢視面板點擊按鈕進入編輯模式,或滑鼠左鍵點光照探頭上黃色的球來自動啟用Edit Light Probes模式。同時按住SHIFT鍵可以複選多個部分。

這裡選一面的所有光照探頭,將它們移動到資源(樹、石頭等等)的邊界位置。按這種方式移動了所有面,讓主場景的非靜態資源如樹、石頭等等,都在光照探頭組內部。因此,它們可以通過預計算即時全域光照獲得地面的反射光。

在正交視圖(Orthographic View)下選擇整面的光照探頭,複製(按住CTRL+SHIFT)並移動幾次,以覆蓋主場景的所有非靜態資源。

複製並移動光照探頭後,整個Light Probe Group就完成

刪除或移動多個光照探頭還有其它方式,但上面這種方式可用於儘快創建示例場景。在層級視圖中取消選擇Light Probe Group,光照探頭會變灰色

接下來測試光照探頭如何運作,例如有多少光從地面反彈到石頭上。通常禁用光照探頭組Gizmo會有助於更好地觀察場景。在場景視圖中的Gizmos下拉式功能表中取消勾選LightProbeGroup。

現在可以透過檢視面板上關閉或啟用Light Probe Group組件來測試光照探頭組的效果。可以清楚看到石頭從地面上反射出綠光。這是預計算即時全域光照對靜態地形和使用光照探頭組的非靜態物體所帶來的影響。

如何為低多邊形場景設置後處理


1.首先導入後製包資源
選擇Assets > Import Package > Effects。

或是可以從Unity官網下載標準資源包,導入所需的特效資源。將Image Effects導入到項目中。

在鏡頭上加上後處理圖像特效

加入你想要的特效,如果想瞭解每個效果是甚麼功能,也可以觀看另一個教學

1)加上Screen Space Ambient Occlusion,在Hierarchy視窗選Main Camera,在檢視面板中點Add Component,加上Screen Space Ambient Occlusion組件。

可以調整設定以讓場景效果更好。可以參考原文的設定。 

2)加上Global Fog元件,點Add Component按鈕並搜索Global Fog。

另外,Lighting介面Scene頁籤下的Fog,以設定Global Fog Color和其他霧效屬性。

3)加上Depth of Field組件,點Add Component並且搜索Depth of Field(Lens Blur,Scatter…)

調整設定讓場景效果是你要的。比如Depth of Field設定焦點在篝火上。

4)加上Tonemapping組件

5)加上Antialiasing並保持預設值。

6)加上Bloom,我通常將Threshold設為0.6。

7)加上Color Correction (3D Lookup…),並保持預設值。

8)加上Vignette and Chromatic Aberration。調整到想要的效果

3.設定 Color Correction Lookup Texture

拍一張螢幕抓圖,打開Photoshop貼上剛剛的圖。然後調整圖像的Adjustments到想要的場景氛圍。可以嘗試一些不同的感覺,作者只稍微改變一點亮度/對比度和色彩平衡

調整好後,需要匯入Color Lookup Texture到Photoshop中的截圖上。可以在Unity專案中找到Color Lookup Texture。在Assets > Standard Assets > Image Effects > Textures目錄下有名為Neautral3D16的貼圖。

如果找不到該圖,請確保之前有按照我的流程從Standard Assets資源包匯入了Image Effects。

導入Color Lookup Texture到Photoshop後,確保貼圖層級在Image Adjustment Effects的下方。

然後選擇Color Lookup Texture並用Crop Tool進行裁剪,僅保留該貼圖。

選擇File -> Save As…將檔存為.PNG格式(任和名稱)用於Unity專案,也可以放在新資料夾。

現在打開Unity,在層級視圖選中Main Camera,在檢視面板中打開Color Correction Lookup (Script)。將剛剛存的Color Lookup Texture拖拽至” None (Texture 2D)”的方形區域上,並且點擊“Conver and Apply”。

你就會看到調整後的效果。

@註:Unity有釋出新版本的後製工具,會比Unity內建的後製工具效能好很多,也支援VR。建議學習過這個流程之後,也可以換成新的後製工具。要注意的新的工具設定流程是完全不同的。

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊